mcpField
M
mcp-cookidoo

mcp-cookidoo

ローカル
github.com/herp75ゲーム・エンタメ02 日前に更新

mcp-cookidoo について

mcp-cookidoo は、Thermomix ユーザー向けに Cookidoo のレシピや献立を管理する MCP サーバーです。レシピ検索・編集、買い物リスト、献立、コレクションに対応し、ガイド付き調理の設定も扱います。Cookidoo の非公開 Web API を使う非公式プロジェクトです。

主な機能

  1. 01レシピ検索と詳細の取得
  2. 02カスタムレシピの作成と編集
  3. 03買い物リストの管理
  4. 04日付ごとのレシピ計画
  5. 05コレクションの作成と管理
  6. 06Thermomix のガイド付き調理設定

活用シーン

  1. 01食材や所要時間でレシピを検索
  2. 02カタログレシピをカスタムレシピに変更
  3. 03計画したレシピから買い物リストを作成
  4. 04週の献立にレシピを整理

MCP 対応

MCP クライアントに Cookidoo のアカウント、レシピ、買い物リスト、献立、コレクション、Thermomix デバイスのツールを提供します。stdio と HTTP のトランスポートに対応します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"herp75-mcp-cookidoo": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"COOKIDOO_EMAIL",
"-e",
"COOKIDOO_PASSWORD",
"-e",
"COOKIDOO_COUNTRY",
"-e",
"COOKIDOO_LANGUAGE",
"-e",
"COOKIDOO_DEVICE",
"-e",
"COOKIDOO_IMAGE_DIRS",
"ghcr.io/herp75/mcp-cookidoo:2.2.0"
],
"env": {
"COOKIDOO_EMAIL": "<COOKIDOO_EMAIL>",
"COOKIDOO_PASSWORD": "<COOKIDOO_PASSWORD>",
"COOKIDOO_COUNTRY": "<COOKIDOO_COUNTRY>",
"COOKIDOO_LANGUAGE": "<COOKIDOO_LANGUAGE>",
"COOKIDOO_DEVICE": "<COOKIDOO_DEVICE>",
"COOKIDOO_IMAGE_DIRS": "<COOKIDOO_IMAGE_DIRS>"
}
}
}
}
起動コマンドdocker run -i --rm -e COOKIDOO_EMAIL -e COOKIDOO_PASSWORD -e COOKIDOO_COUNTRY -e COOKIDOO_LANGUAGE -e COOKIDOO_DEVICE -e COOKIDOO_IMAGE_DIRS ghcr.io/herp75/mcp-cookidoo:2.2.0
設定が必要な環境変数
COOKIDOO_EMAILCookidoo account e-mail
COOKIDOO_PASSWORDシークレットCookidoo account password (use a unique one)
COOKIDOO_COUNTRYCookidoo site country code, e.g. ch, de, fr (default fr)
COOKIDOO_LANGUAGECookidoo site language, e.g. de-CH, de-DE, fr-FR (default fr-FR)
COOKIDOO_DEVICEThermomix recipes are written for: TM5, TM6 or TM7 (default: detected)
COOKIDOO_IMAGE_DIRSFolders upload_custom_recipe_image may read, ':'-separated; in the container, mount them read-only (default: upload disabled)

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
ocighcr.io/herp75/mcp-cookidoo:2.2.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

Cookidoo MCP サーバー

FastMCP で構築された、Thermomix Cookidoo プラットフォームと連携するための MCP(Model Context Protocol)サーバーです。

免責事項: これは非公式のプロジェクトです。開発者は Cookidoo、Vorwerk、Thermomix、またはその子会社や商標とは一切関係がなく、承認も受けていません。ご自身のアカウントで Cookidoo の非公開 Web API を使用します。これは Cookidoo の利用規約に抵触する可能性があり、Cookidoo がサイトを変更するたびに動作しなくなる可能性があります(週次のライブテストで監視しています)。自己責任でご利用ください。

機能

  • レシピ検索:キーワードや食材、またはその両方と合計所要時間の上限を指定してレシピを検索します
  • レシピの詳細:Cookidoo のレシピの材料、手順、所要時間を取得します
  • カスタムレシピ:ご自身のアカウントのレシピを一覧表示、読み取り、作成、更新、削除します
  • 買い物リスト:レシピや品目の追加、購入済みへのチェック、名前変更、削除、またはリストの消去ができます
  • 食事プラン:週の予定を確認し、特定の日にレシピを登録したり、削除したりできます
  • コレクション:コレクションの一覧表示、フォロー、作成、およびレシピの追加と削除ができます
  • アカウント:サブスクリプションと連携済みの Thermomix デバイスを確認できます
  • ガイド付き調理:手順に Thermomix の設定(時間、温度、速度、逆回転)を含め、マシンにあらかじめ設定できます
  • ガイド付きプロンプト:create_thermomix_recipe により、適切な Thermomix レシピの作成をアシスタントが段階的に進められます(EN / FR / DE)

セットアップ

Python 3.12 以降と uv が必要です。

uv sync
cp .env.example .env   # then fill in your Cookidoo credentials
変数デフォルト説明
COOKIDOO_EMAIL—Cookidoo アカウントのメールアドレス(必須)
COOKIDOO_PASSWORD—Cookidoo アカウントのパスワード(必須)
COOKIDOO_COUNTRYfrCookidoo サイトの国コード(fr、de、gb、es、…)
COOKIDOO_LANGUAGEfr-FRサイトの言語(例:de-DE)。ガイド付き調理の設定の記述にも使用されます
COOKIDOO_DEVICE—(自動検出)Thermomix レシピの対象機種(TM5、TM6、TM7)。未設定の場合はアカウントに連携されたデバイスから選択され(TM6 が含まれる場合は TM6 のルールを使用)、それ以外は TM6 が選択されます
COOKIDOO_IMAGE_DIRS—(アップロード無効)upload_custom_recipe_image が画像を読み込めるフォルダー。: で区切ります(Windows では ;)
COOKIDOO_MCP_TRANSPORTstdiostdio または http(--transport と同じ)
COOKIDOO_MCP_HOST127.0.0.1HTTP のバインドアドレス。ループバック以外のアドレスを使用するには COOKIDOO_MCP_TOKEN が必要です
COOKIDOO_MCP_PORT8000HTTP ポート
COOKIDOO_MCP_TOKEN—HTTP モード用のベアラートークン。32 文字以上(例:openssl rand -hex 32)
COOKIDOO_TEST_EMAIL、COOKIDOO_TEST_PASSWORD—ライブテスト専用:専用のテストアカウント(ライブテストを参照)
COOKIDOO_TEST_COUNTRY、COOKIDOO_TEST_LANGUAGEch、de-CHライブテスト専用:テストアカウントのサイト

使用方法

Claude Code
claude mcp add cookidoo -- uv run --directory /path/to/mcp-cookidoo server.py
Claude Desktop

バンドル(最も簡単): 最新リリースから mcp-cookidoo-<version>.mcpb をダウンロードし、Claude Desktop で開きます。Cookidoo のメールアドレス、パスワード(システムの安全なストレージに保存されます)、サイト、Thermomix を指定すると、Claude Desktop が Python と依存関係を自動でインストールします。

チェックアウトからセットアップする場合:

claude_desktop_config.json に追加します。

{
  "mcpServers": {
    "cookidoo": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/mcp-cookidoo", "server.py"]
    }
  }
}
Docker

amd64 と arm64 用のイメージは GitHub Container Registry に公開されています。edge は main の変更ごとにビルドされ、バージョンタグ(1、1.2、1.2.0)はリリースから作成されます。クライアントの設定に記載するのではなく、認証情報を環境変数ファイル(chmod 600)に保存してください。

{
  "mcpServers": {
    "cookidoo": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "--env-file", "/path/to/cookidoo.env",
               "ghcr.io/herp75/mcp-cookidoo:edge"]
    }
  }
}

cookidoo.env には上の表の変数を記載します(COOKIDOO_EMAIL=… のように、1 行に 1 つ)。 upload_custom_recipe_image を使うには、写真フォルダーを読み取り専用でマウントし、COOKIDOO_IMAGE_DIRS に指定します。イメージ名の前に "-v", "/path/to/photos:/photos:ro", "-e", "COOKIDOO_IMAGE_DIRS=/photos" を追加してください。 イメージを自分でビルドする場合:docker build -t mcp-cookidoo .。root 以外のユーザーとして実行されます。

リリースの検証

イメージは、このリポジトリの Docker ワークフローによって cosign でキーレス署名され、リリースファイルには GitHub のビルド来歴情報が付与されています。

cosign verify ghcr.io/herp75/mcp-cookidoo:2.0.0 \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  --certificate-identity-regexp '^https://github.com/herp75/mcp-cookidoo/\.github/workflows/docker\.yml@'
gh attestation verify mcp-cookidoo-2.0.0.mcpb --repo herp75/mcp-cookidoo

このサーバーは、io.github.herp75/mcp-cookidoo として MCP Registry にも登録されています。

HTTP
uv run server.py --transport http                   # http://127.0.0.1:8000/mcp

# Reachable from other machines: a token is required, the server refuses to start without one
COOKIDOO_MCP_TOKEN=$(openssl rand -hex 32) COOKIDOO_MCP_HOST=0.0.0.0 uv run server.py --transport http

クライアントはその後、Authorization: Bearer <token> を送信します。GET /health は {"status":"ok"} を返します。Docker では、コンテナ内のすべてのインターフェースにサーバーをバインドする必要があるため、トークンが必要です。ポートはループバックのみに公開してください。

docker run --rm --env-file cookidoo.env -e COOKIDOO_MCP_HOST=0.0.0.0 \
  -e COOKIDOO_MCP_TOKEN="$(openssl rand -hex 32)" -p 127.0.0.1:8000:8000 \
  ghcr.io/herp75/mcp-cookidoo:edge --transport http

トークンがない場合、サーバーは localhost、127.0.0.1、[::1](Host ヘッダー)宛てのリクエストにのみ応答します。また、ブラウザーからのアクセスは、このマシンで配信されたページ(Origin)からのものに限られます。これにより、DNS リバインディングを通じてウェブページからアクセスされるのを防ぎます。リバースプロキシの背後で使用する場合や、別のホスト名で使用する場合は、トークンを設定してください。

これらのチェックをスキップする fastmcp run … --transport http ではなく、server.py を使用してください。

開発
uv run fastmcp dev inspector fastmcp.json           # MCP Inspector

利用可能なツール

種類:read = 読み取り専用、write = アカウントを変更、destructive = データを削除または上書きします。†が付いたツールは、クライアントの承認プロンプトに加えた第2の安全策として、confirm=trueを指定しないと実行されません。

ツール種類説明
レシピ
search_recipesreadクエリ、材料、合計時間の上限でレシピを検索します
get_recipe_detailsreadIDでレシピの材料、手順、所要時間を取得します
カスタムレシピ
list_custom_recipesreadアカウントのカスタムレシピを一覧表示します
get_custom_reciperead編集可能なJSON形式でカスタムレシピを取得します
generate_recipe_structurereadThermomix(TM5/TM6/TM7)用の新しいレシピを検証し、そのJSONを返します
upload_custom_recipewriteThermomix用に、そのJSONからカスタムレシピを作成します
update_custom_recipedestructive既存のカスタムレシピをそのJSONで置き換えます
copy_recipe_to_customwriteカタログのレシピを新しいカスタムレシピにコピーし、アレンジできるようにします
upload_custom_recipe_imagedestructiveローカル画像からカスタムレシピの写真を設定します(COOKIDOO_IMAGE_DIRSを参照)
delete_custom_recipe †destructiveカスタムレシピを完全に削除します
買い物リスト
get_shopping_listreadレシピ、材料、手動で追加したアイテムを、チェック状態とIDとともに取得します
add_recipes_to_shopping_listwriteカタログおよび/またはカスタムレシピの材料を追加します
remove_recipes_from_shopping_listdestructiveレシピとその材料を削除します
add_shopping_list_itemswriteアイテムを手動で追加します(「牛乳」「レモン2個」など)
edit_shopping_list_itemsdestructive手動で追加したアイテムの名前を変更します
mark_shopping_list_itemswriteアイテムにチェックを付ける、またはチェックを外します
remove_shopping_list_itemsdestructive手動で追加したアイテムを削除します
clear_shopping_list †destructive買い物リスト全体を空にします
ミールプラン
get_meal_plan_weekread指定した日から始まる7日間に予定されたレシピを取得します
add_to_meal_planwriteカタログおよび/またはカスタムレシピを指定した日の予定に追加します
move_in_meal_plandestructive予定されたレシピを別の日に移動します(失敗時はロールバックされます)
remove_from_meal_plandestructiveその日のレシピを削除します(レシピ自体は保持されます)
コレクション
list_collectionsread自分のコレクションとフォロー中のコレクションを、レシピとともに一覧表示します(ページ分けあり)
follow_collection / unfollow_collectionwrite / destructiveCookidooのコレクションをフォローまたはフォロー解除します
create_collectionwriteカスタムコレクションを作成します
delete_collection †destructiveカスタムコレクションを削除します(レシピ自体は保持されます)
add_to_collection / remove_from_collectionwrite / destructiveカスタムコレクションのレシピを追加または削除します
Thermomix
get_thermomix_modesreadデバイスがサポートする設定とモードを、制限事項や例とともに取得します
アカウント
connect_to_cookidooread設定を確認する/新たにログインし直します(任意。ツールは自動的にログインします)
get_account_inforeadユーザー、Cookidooのサイト、サブスクリプション、デバイスを取得します
list_devicesreadアカウントにリンクされたThermomixデバイスを一覧表示します

レシピの手順

手順は、プレーンテキスト、またはガイド付き調理で Thermomix の設定プリセットや材料へのリンクを含むオブジェクトのいずれかです。テキストには設定ごとに {settings} プレースホルダーが1つ含まれ、アカウントの言語(COOKIDOO_LANGUAGE)で設定を展開した表記に置き換えられます。対応言語はフランス語、英語、ドイツ語です。それ以外の言語では英語で表記されます。Thermomix に設定されるプリセットは、言語にかかわらず同じです。

{
  "text": "Add the onion and the olive oil, then sauté {settings}.",
  "settings": [{"time": 180, "temperature": "120", "speed": "1", "reverse": true}],
  "ingredients": [{"text": "the onion", "ingredient": "1 onion, halved"}]
}

設定の mode によって使用するフィールドが決まります。制限は Cookidoo レシピエディター(cookidoo.de のスナップショット、2026-10-20)のもので、レシピの対象となる Thermomix によって異なります。

modeデバイスフィールドと制限表記(fr)表記(de)
manual(デフォルト)TM5、TM6、TM7time(1秒~99分)、temperature(任意:「"37"」~「"95"」を5刻み、「"98"」、「"100"」~「"120"」を5刻み、またはTM6のみ「"varoma"」)、speed(温度を指定する場合は最大「"6"」)、reverse3 min/120°C/vitesse 13 Min./120°C/Stufe 1
doughTM6、TM7time(最大20分)Pétrin/2 minTeig kneten/2 Min.
browningTM7time(最大30分)、temperature(「"140"」~「"160"」を5刻み)、power(gentle、intense)Rissolage/5 min/160°C/intenseAnbraten/5 Min./160°C/Intensiv
steamingTM7time(最大99分)、speed(最大「"5"」)、reverse、accessory(varoma、simmering_basket、varoma_and_simmering_basket)Cuisson vapeur/20 min/Varoma/vitesse 1Dampfgaren/20 Min./im Varoma/Stufe 1
turboTM6、TM7time(0.5、1、または2秒)、pulses(1~9、TM7のみ)Turbo/0.5 sec/3 foisTurbo/0.5 Sek./3x
rice_cookerTM6、TM7なしRice cookerReis kochen
warm_upTM6、TM7temperature(「"37"」~「"90"」)、speed("soft"、"1"、"2"。時間は指定できません。Cookidoo によって削除されます)Réchauffage/65°C/vitesse 2Erwärmen/65°C/Stufe 2
blendTM6、TM7time(10秒~5分)、speed(「"6"」~「"8"」)Mixage/1 min/vitesse 8Pürieren/1 Min./Stufe 8

speed は "soft"(かき混ぜ速度、Sanftrührstufe)または "0.5"~"10" の0.5刻みです(ドイツ語では Stufe 0,5 と表記されます)。Cookidoo にはカスタムレシピ向けの他のモードはありません(低温調理、スロークッキング、発酵などはカタログ内のレシピにのみ存在します)。

対象デバイス。 generate_recipe_structure、upload_custom_recipe、update_custom_recipe では任意の device(TM5、TM6、TM7)を指定でき、そのデバイスがサポートしていない設定は、使用可能な値を示して拒否されます。指定しない場合は、更新時にはレシピ自体のデバイス、次に COOKIDOO_DEVICE、次にアカウントにリンクされているデバイス(TM6 が含まれている場合は TM6 のルールが適用されます。TM6 に対応する手順は TM7 でも動作するためです)、最後に TM6 の順で選択されます。エディターの刻みに合わない時間(5分までは10秒刻み、20分までは30秒刻み、それ以降は1分刻み)は警告のみとなります。どのモードが存在するか、およびどのモードが TM7 専用かは、アカウントの Cookidoo レシピエディターから読み取られ(1時間キャッシュされます)、取得できない場合は組み込みのスナップショットが使われます。ツールの出力には、どちらが使用されたかが示されます。Cookidoo に登録済みのレシピは、値にかかわらず常に読み取ることができ、再保存する場合にのみ検証されます。

モードは名前付きで記述されるため、テキスト内で名前を繰り返す必要はありません(「knead {settings}」ではなく「then start {settings}」とします)。

ingredients は、手順のテキスト中にある単語(最初の出現箇所)を材料リストの項目にリンクします。無効な設定やリンクは拒否されます。get_custom_recipe は手順を同じ形式で返すため、レシピを編集しても設定とリンクは保持されます。

セキュリティ

  • サーバーはCookidooの実際のパスワードを保存します(CookidooにはOAuthがありません)。一意のパスワードを使用してください。
  • stdioを優先してください。HTTPは、信頼できるネットワーク上でトークンを使う場合にのみ使用してください。
  • TLS証明書の検証は常に有効です。ログやエラーメッセージからシークレットは伏せられます。
  • レシピの内容は、モデルにとって信頼できない入力です。書き込みツールでは、クライアントの承認プロンプトを有効にしておいてください。
  • upload_custom_recipe_imageは、ローカルファイルを読み取ってインターネットに送信する唯一のツールです。COOKIDOO_IMAGE_DIRSを設定するまで無効です。ホームディレクトリではなく、レシピの写真だけを格納したフォルダーを指定してください。このフォルダー外のファイル(シンボリックリンク経由のものも含む)や、JPEG/PNG/WebP以外のファイル、10 MBを超えるファイルは拒否されます。アップロード前に画像は再エンコードされ、メタデータ(EXIF、GPS位置情報)が削除されます。Dockerを使う場合は、そのフォルダーを読み取り専用でマウントしてください(-v ~/RecipePhotos:/photos:ro -e COOKIDOO_IMAGE_DIRS=/photos)。

脅威モデルと脆弱性の報告方法については、SECURITY.mdを参照してください。

開発

ワークフローについてはCONTRIBUTING.mdを、コードの構成についてはdocs/architecture.mdを参照してください。

uv sync
uv run pytest --cov                    # tests, coverage must stay at 85 % or more
uv run ruff check . && uv run ruff format .
uv run pyright
scripts/check_insecure_patterns.sh     # TLS / bind-address guard, also run in CI

CIでは、pip-audit、gitleaks、CodeQL、依存関係レビュー、DockerイメージのTrivyスキャンも実行します。

ライブテスト

tests/liveは実際のCookidoo APIに対して実行されます。専用のテストアカウントを使用し、自分のアカウントは絶対に使わないでください。書き込みテストでは、レシピ、コレクション、買い物リストの項目、ミールプランのエントリーを作成して削除します(すべて「MCP live test …」という名前です)。

cp .env.live.example .env.live && chmod 600 .env.live   # then fill in the test account
uv run pytest tests/live --live -p no:logging --assert=plain        # read-only
uv run pytest tests/live --live-write -p no:logging --assert=plain  # also writes, cleans up

テストではCOOKIDOO_TEST_*のみを読み取り、COOKIDOO_EMAILに設定されたアカウントでは実行を拒否します。「Live tests」ワークフローは、live環境のシークレットCOOKIDOO_TEST_EMAILおよびCOOKIDOO_TEST_PASSWORDを使って、週に一度テストを実行します(デプロイ対象ブランチはmainのみです。任意の変数COOKIDOO_TEST_COUNTRY、COOKIDOO_TEST_LANGUAGEのデフォルト値はch/de-CHです)。また、Cookidooのレシピエディターとdevices.pyを比較し、差異があればissueを作成します。

クレジット

  • alexandrepa/mcp-cookidoo(Alexandre Patelli作):このフォークの基盤となったオリジナルのサーバーです。
  • tobilektri/mcp-cookidoo(MIT):ドイツ語のThermomix表記、デバイスごとのモード制限、エディターページのパーサーとフィクスチャです。
  • vitaliemiron/cookidoo-mcp(Apache-2.0):レシピ画像のアップロードとミールプランの移動です。NOTICEを参照してください。
  • danielkliem/mcp-cookidooおよびsisques-labs/cookidoo-mcp:機能の着想のみを参考にしており、コードはコピーしていません。
  • cookidoo-api(miaucl作):ここで使われているすべての機能の基盤となる、Cookidooプラットフォーム用Pythonクライアントです。
  • オリジナルのリポジトリにプルリクエストを送ってくださった皆さん:そのアイデア(検索、レシピ編集、Docker/STDIO対応)がこのプロジェクトの形を作りました。

ライセンス

MITです。LICENSEおよびNOTICEを参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。