Skip to main content
Glama
timo-reymann

mealie-mcp-server

by timo-reymann

mealie-mcp-server

LICENSE GitHub Actions GitHub Release Renovate

Mealie レシピ管理のための Model Context Protocol (MCP) サーバーです。AI アシスタントがレシピ、献立、買い物リスト、カテゴリ、タグを検索・作成・管理するための 46 のツールと 1 つのプロンプトを提供します。

特徴

  • レシピ管理 — レシピの検索、作成、パッチ適用、複製、削除。並行性を制限したバッチ取得で複数レシピを一括取得できます。

  • 食材ベースのレシピ検索find_recipes_for_ingredients は、人間が読める食材名(Mealie のフード UUID ではなく)を Mealie の食品タクソノミーに対して解決し、Mealie の Recipe Finder を介して一致するレシピを見つけます。完全一致の食品がない場合は通常のレシピ検索にフォールバックします。「X で何が作れるか」という発見に役立ち、Mealie がその正確な名前で知らない食材も扱えます(呼び出し側の LLM が代替語で検索を広げます。MCP 自体は代替を推測しません)。

  • レシピのカテゴリ・タグ割り当て — 既存レシピにカテゴリとタグを、マージ/置換セマンティクス、名前/スラッグ/ID 解決、欠落値の自動作成オプション付きで割り当てられます。材料、手順、栄養情報、その他のレシピフィールドには影響しません。patch_recipeupdate_recipe_taxonomyupdate_recipe_taxonomy_batch から利用できます。

  • 献立管理 — 献立の閲覧、作成、一括作成。複合ツールは、並行バッチリクエストを使用してレシピ詳細(栄養情報を含む)を埋め込んだ献立を取得し、N+1 クエリを排除します。

  • 買い物リスト — リストとアイテムの完全な CRUD、一括操作、レシピからリストへの統合。

  • カテゴリとタグ — レシピ整理のための完全な CRUD。空のカテゴリ/タグの検出も含みます。

  • バッチ・複合ツールget_recipes_batchget_recipes_detailed_batch は並行性を制限したレシピ検索、get_mealplan_with_recipes はレシピデータを埋め込んだ献立の取得とクライアント側の日付フィルタリング、update_recipe_taxonomy_batch は多数のレシピに対する並行性を制限したカテゴリ/タグ更新を提供します。

  • SDK 以外のランタイム依存関係ゼロ — ネイティブの fetch を使用し、axios や httpx は不要です。

Related MCP server: mcp-mealie

要件

  • Node.js >= 22

  • API キーを持つ実行中の Mealie インスタンス

インストール

クイックスタート(npx)

MEALIE_BASE_URL=https://your-mealie-instance.com \
MEALIE_API_KEY=your-api-key \
npx mealie-mcp-server

opencode 設定

opencode.json に追加します:

{
  "mcp": {
    "mealie-mcp-server": {
      "type": "local",
      "command": ["npx", "mealie-mcp-server"],
      "enabled": true,
      "environment": {
        "MEALIE_BASE_URL": "https://your-mealie-instance.com",
        "MEALIE_API_KEY": "your-api-key"
      }
    }
  }
}

Docker

コンテナで MCP サーバーを実行します:

docker run -d \
  --name mealie-mcp-server \
  -e MEALIE_BASE_URL=https://your-mealie-instance.com \
  -e MEALIE_API_KEY=your-api-key \
  ghcr.io/timo-reymann/mealie-mcp-server:main

または Docker Compose を使用:

version: '3.8'
services:
  mealie-mcp-server:
    image: ghcr.io/timo-reymann/mealie-mcp-server:main
    environment:
      MEALIE_BASE_URL: https://your-mealie-instance.com
      MEALIE_API_KEY: your-api-key
    restart: unless-stopped

ローカル開発

git clone https://github.com/timo-reymann/mealie-mcp-server.git
cd mealie-mcp-server
corepack enable
yarn install
cp .env.template .env
# Edit .env with your MEALIE_BASE_URL and MEALIE_API_KEY
yarn dev

環境または opencode 設定で MEALIE_BASE_URLMEALIE_API_KEY が設定されていることを確認してください。

ドキュメント

全 46 ツールと対応する Mealie API エンドポイントの詳細な内訳については、API カバレッジ を参照してください。

食材によるレシピ検索

find_recipes_for_ingredients を使用すると、AI アシスタントは人間が読める食材名(例: "branzino""chicken thighs")からレシピを発見でき、Mealie の内部フード UUID を知る必要はありません。MCP は Mealie 固有の仕組み(名前を Mealie の Food オブジェクトに解決、Mealie の Recipe Finder(GET /api/recipes/suggestions)または通常のレシピ検索の呼び出し)をすべて処理します。一方、食材の代替・拡張(例: "branzino" の妥当な代替として "sea bass""whole fish" を判断すること)は呼び出し側の LLM に委ねられます。

食材の解決は、食材ごとに次の順序で行われます:

  1. 食品名との大文字小文字を区別しない完全一致。

  2. 食品の複数形名またはエイリアスのいずれかとの大文字小文字を区別しない完全一致(Mealie の Food オブジェクトには Category/Tag と異なり slug フィールドがありません)。

  3. 上記が一致しない場合、Mealie の食品検索からの一意の結果が 1 つだけの場合。

名前が複数の食品に一致し、一意の候補がない場合(例: "fish")、候補名とともに ambiguous として報告されます。ツールは推測しません。

検索戦略は、解決された内容によって異なります:

{ "ingredients": ["salmon"], "categories": ["Dinner"] }

salmon を Food に解決し、Mealie の Recipe Finder を使用します。レシピは、解決された食材をいくつ使用しているか、欠落している他の食材がどれだけ少ないかでランク付けされます。matchSource: "suggestions"

{ "ingredients": ["branzino"] }

branzino に Food の一致がない場合 → Mealie の通常のレシピ検索(レシピ名、説明、材料テキストに一致)にフォールバックします。それでも有用な結果がない場合、unresolvedIngredients がそれを報告し、LLM は "sea bass""whole fish" などのより広い用語で再試行できます。matchSource: "text-search"(結果がない場合は "none")。

{ "ingredients": ["chicken thighs", "broccoli"], "requireAllIngredients": true }

2 つ以上の解決済み食材と requireAllIngredients: true を使用する場合、Finder の代わりに厳密な食品ベースの AND フィルターを使用した Mealie の通常のレシピ検索を使用します。matchSource: "food-filter"

categories/tagsget_recipes と同じ方法(名前、スラッグ、または ID で大文字小文字を区別せず)で解決され、検索実行前に正規の ID として Mealie に送信されます。food-filter パスと text-search パスではそのまま使用され、Recipe Finder パス(独自のタクソノミーフィルターがない)では返された候補に適用されます。

返される各レシピには、nameslugdescriptioncategoriestagstotalTime、一致した要求食材、および(Recipe Finder の結果の場合)欠落している他の食材が含まれます。これにより、get_recipe_detailedget_recipes_batch で詳しく確認する価値があるかを、候補ごとに追加のラウンドトリップなしで判断できます。

カテゴリとタグの割り当て

カテゴリはレシピブックを整理するための広いグループ(例: DinnerDessert)であり、タグはより具体的で自由形式の属性(例: QuickDairy-Free)です。どちらも update_recipe_taxonomy(この 1 つのジョブに特化したツール)または patch_recipe(既存フィールドに加えて categories/tags/taxonomyMode/createMissing も受け付けるため、名前/説明の編集とタクソノミー変更を 1 回の呼び出しで送信できます)を介して既存レシピに割り当てられます。

categories/tags の各値は、名前、スラッグ、または ID のいずれでもかまいません。既存のカテゴリ/タグとの照合は、名前とスラッグで大文字小文字を区別せずに行われます。結果は自動的に重複排除されます。

カテゴリとタグを追加し、レシピがすでに持っている他のすべてを保持する場合(mode: "merge"、デフォルト):

{
  "slug": "chicken-shawarma",
  "categories": ["Dinner"],
  "tags": ["Dairy-Free", "Quick"],
  "mode": "merge",
  "createMissing": false
}

タグリストを完全に置き換え、以前のタグを破棄する場合:

{
  "slug": "chicken-shawarma",
  "tags": ["Weeknight", "Middle Eastern"],
  "mode": "replace",
  "createMissing": true
}

上記の createMissing: true は、WeeknightMiddle Eastern が存在しない場合に自動的に作成されることを意味します。

レシピからすべてのカテゴリをクリアするには、mode: "replace" で明示的な空配列を渡します。categories を省略すると、そのまま残ります:

{
  "slug": "chicken-shawarma",
  "categories": [],
  "mode": "replace"
}

多数のレシピを一度に更新するには、update_recipe_taxonomy_batch を使用します。各エントリは独立して処理され(並行性制限付き)、レスポンスにはレシピごとの成功またはエラー結果が含まれるため、1 つの不正なスラッグでバッチ全体が失敗することはありません:

{
  "updates": [
    { "slug": "chicken-shawarma", "categories": ["Dinner"], "mode": "merge" },
    { "slug": "banana-bread", "tags": ["Dessert", "Baking"], "mode": "merge" },
    { "slug": "does-not-exist", "categories": ["Dinner"], "mode": "merge" }
  ]
}

どちらのツールも、レシピの id/slug に加えて、コレクションごとに更新後の final リストと、addedremovedcreated されたアイテムを返します。正確に何が変更されたかを確認するのに役立ちます。

コントリビューション

あなたのインプットを歓迎します!始めるには コントリビューションガイドライン をお読みください。

開発

要件

  • Node.js >= 22

  • Yarn(Corepack 経由: corepack enable

  • 統合テスト用の Mealie インスタンス(または fetch レイヤーのモック)

テスト

yarn test

型チェック

yarn typecheck

ビルド

yarn build

リント

yarn lint

利用可能なツール(全 46 個)

レシピ(14)

get_recipesfind_recipes_for_ingredientsget_recipe_detailedget_recipe_conciseget_recipes_batchget_recipes_detailed_batchcreate_recipepatch_recipeupdate_recipe_taxonomyupdate_recipe_taxonomy_batchduplicate_recipemark_recipe_last_madeset_recipe_image_from_urldelete_recipe

献立(5)

get_all_mealplansget_mealplan_with_recipescreate_mealplancreate_mealplan_bulkget_todays_mealplan

カテゴリ(7)

get_categories, get_empty_categories, create_category, get_category, get_category_by_slug, update_category, delete_category

タグ(7)

get_tags, get_empty_tags, create_tag, get_tag, get_tag_by_slug, update_tag, delete_tag

買い物リスト(13)

get_shopping_lists, create_shopping_list, get_shopping_list, update_shopping_list, delete_shopping_list, add_recipe_to_shopping_list, remove_recipe_from_shopping_list, get_shopping_list_items, create_shopping_list_item, create_shopping_list_items_bulk, update_shopping_list_item, delete_shopping_list_item, delete_shopping_list_items_bulk

ライセンス

MIT

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
1hResponse time
3dRelease cycle
17Releases (12mo)
Commit activity
Issues opened vs closed

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…

  • Markdown-first MCP server for Notion API with 8 composite tools and 39 actions.

  • Recipes MCP — wraps TheMealDB API (free tier, no auth)

View all MCP Connectors

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/timo-reymann/mealie-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server