Skip to main content
Glama
dvejsada

mealie-mcp

by dvejsada

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

Authorization: Bearer <token>

A static secret (set via MCP_AUTH_TOKEN) that gates the server. Requests without a valid token are rejected with 401.

Mealie API token

X-Mealie-Token: <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)

Recipessearch_recipes, get_recipe, get_recipe_suggestions Reference datalist_categories, list_tags, list_tools, list_foods, list_units, list_cookbooks Householdget_shopping_lists, get_shopping_list, get_meal_plan, get_todays_meals Instanceget_current_user, get_app_info

Write tools (only when MEALIE_READONLY=false)

Recipescreate_recipe_from_url, create_recipe, update_recipe, delete_recipe, mark_recipe_made Shoppingadd_shopping_item, set_shopping_item_checked, add_recipe_to_shopping_list Meal planscreate_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 -d

The 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.py

Connecting 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

MCP_AUTH_TOKEN

yes

Comma-separated secret bearer token(s) for the MCP endpoint.

MEALIE_BASE_URL

no¹

Default Mealie base URL (e.g. https://mealie.example.com).

MEALIE_READONLY

no

true

Set false to also register write tools.

MEALIE_TIMEOUT

no

30

Outbound request timeout in seconds.

MEALIE_VERIFY_SSL

no

true

Set false for self-signed Mealie certs.

MCP_HOST

no

0.0.0.0

Bind address.

MCP_PORT

no

8000

Bind port.

MCP_PATH

no

/mcp

Endpoint path.

MCP_LOG_LEVEL

no

info

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:latest

CI/CD

Three GitHub Actions workflows are included (.github/workflows/):

  • ci.yml — runs ruff, pyright, and pytest on 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 (tags X.Y.Z, X.Y, X, and latest).

  • claude.yml — runs Claude Code when someone mentions @claude in an issue, PR, or review comment.

Configure these repository secrets (Settings → Secrets and variables → Actions):

Secret

Used by

How to get it

DOCKERHUB_USERNAME

docker-publish

Your Docker Hub username (with push access to georgx22/mealie-mcp).

DOCKERHUB_TOKEN

docker-publish

A Docker Hub access token (Account Settings → Security → New Access Token).

CLAUDE_CODE_OAUTH_TOKEN

claude

Run claude setup-token locally (Claude Pro/Max), paste the token.

To cut a release (which triggers the image build):

gh release create v0.1.0 --generate-notes

Development

pip install -e ".[dev]"
ruff check .     # lint
pyright          # type check
pytest -q        # tests

See CONTRIBUTING.md for details. Changes are tracked in CHANGELOG.md. Licensed under MIT.

A
license - permissive license
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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