mealie-mcp
Provides tools for searching and retrieving recipes, listing reference data (categories, tags, tools, foods, units, cookbooks), managing shopping lists, viewing meal plans, and accessing user and app info from a Mealie instance.
Click on "Install 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-mcpsearch for quick dinner recipes"
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 server for Mealie, built with FastMCP and served over the Streamable HTTP transport. Ships as a Docker container.
It exposes tools only — no MCP resources or prompts. It is read-only by
default; write tools can be enabled with MEALIE_READONLY=false.
How auth works
There are two independent credentials:
Credential | Header | Purpose |
MCP endpoint token |
| A static secret (set via |
Mealie API token |
| Supplied per request by each client. The server forwards it to Mealie as a bearer token, so one server can serve many Mealie users. |
Optionally, a client can target a different Mealie instance per request with the
X-Mealie-Url: https://other-mealie.example.com header (otherwise MEALIE_BASE_URL
is used).
Get a Mealie API token from your Mealie profile: Profile → Manage API Tokens.
Related MCP server: paprika-mcp
Tools
Read tools (always available)
Recipes — search_recipes, get_recipe, get_recipe_suggestions
Reference data — list_categories, list_tags, list_tools, list_foods, list_units, list_cookbooks
Household — get_shopping_lists, get_shopping_list, get_meal_plan, get_todays_meals
Instance — get_current_user, get_app_info
Write tools (only when MEALIE_READONLY=false)
Recipes — create_recipe_from_url, create_recipe, update_recipe, delete_recipe, mark_recipe_made
Shopping — add_shopping_item, set_shopping_item_checked, add_recipe_to_shopping_list
Meal plans — create_mealplan_entry, delete_mealplan_entry
Write tools respect the per-request Mealie token's own permissions, so a read-only Mealie token can never mutate data even when write tools are enabled.
Run with Docker
cp .env.example .env
# edit .env: set MCP_AUTH_TOKEN (a long random secret) and MEALIE_BASE_URL
docker compose up --build -dThe MCP endpoint is then available at http://<host>:8000/mcp, with an
unauthenticated liveness probe at http://<host>:8000/healthz.
The endpoint token is the only thing standing between the internet and your Mealie instance. Put the server behind a reverse proxy with TLS, or on a private network, and use a long random
MCP_AUTH_TOKEN.
Run locally (without Docker)
pip install -r requirements.txt
export MCP_AUTH_TOKEN="a-long-random-secret"
export MEALIE_BASE_URL="https://mealie.example.com"
python main.pyConnecting a client
Point your MCP client at the Streamable HTTP endpoint and send both headers. Example with the FastMCP client:
from fastmcp import Client
from fastmcp.client.transports import StreamableHttpTransport
transport = StreamableHttpTransport(
url="http://localhost:8000/mcp",
headers={
"Authorization": "Bearer <your MCP_AUTH_TOKEN>",
"X-Mealie-Token": "<your Mealie API token>",
},
)
async with Client(transport) as client:
tools = await client.list_tools()
result = await client.call_tool("search_recipes", {"search": "soup"})LibreChat
See examples/librechat.yaml for a ready-to-use
mcpServers entry. It maps the endpoint bearer token to a LibreChat environment
variable and each user's Mealie token to a per-user customUserVars field, so
every LibreChat user acts as their own Mealie account.
Configuration
Variable | Required | Default | Description |
| yes | — | Comma-separated secret bearer token(s) for the MCP endpoint. |
| no¹ | — | Default Mealie base URL (e.g. |
| no |
| Set |
| no |
| Outbound request timeout in seconds. |
| no |
| Set |
| no |
| Bind address. |
| no |
| Bind port. |
| no |
| Endpoint path. |
| no |
| uvicorn log level. |
¹ Required unless every client sends the X-Mealie-Url header.
Docker Hub images
Released versions are published to Docker Hub at
georgx22/mealie-mcp
(multi-arch: linux/amd64, linux/arm64):
docker run -d -p 8000:8000 \
-e MCP_AUTH_TOKEN="a-long-random-secret" \
-e MEALIE_BASE_URL="https://mealie.example.com" \
georgx22/mealie-mcp:latestCI/CD
Three GitHub Actions workflows are included (.github/workflows/):
ci.yml— runsruff,pyright, andpyteston every push/PR (Python 3.11–3.13).docker-publish.yml— builds and pushes the multi-arch image to Docker Hub when a GitHub Release is published (tagsX.Y.Z,X.Y,X, andlatest).claude.yml— runs Claude Code when someone mentions@claudein an issue, PR, or review comment.
Configure these repository secrets (Settings → Secrets and variables → Actions):
Secret | Used by | How to get it |
| docker-publish | Your Docker Hub username (with push access to |
| docker-publish | A Docker Hub access token (Account Settings → Security → New Access Token). |
| claude | Run |
To cut a release (which triggers the image build):
gh release create v0.1.0 --generate-notesDevelopment
pip install -e ".[dev]"
ruff check . # lint
pyright # type check
pytest -q # testsSee CONTRIBUTING.md for details. Changes are tracked in CHANGELOG.md. Licensed under MIT.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/dvejsada/mealie-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server