mcp-cookidoo について
mcp-cookidoo は、Thermomix ユーザー向けに Cookidoo のレシピや献立を管理する MCP サーバーです。レシピ検索・編集、買い物リスト、献立、コレクションに対応し、ガイド付き調理の設定も扱います。Cookidoo の非公開 Web API を使う非公式プロジェクトです。
主な機能
- 01レシピ検索と詳細の取得
- 02カスタムレシピの作成と編集
- 03買い物リストの管理
- 04日付ごとのレシピ計画
- 05コレクションの作成と管理
- 06Thermomix のガイド付き調理設定
活用シーン
- 01食材や所要時間でレシピを検索
- 02カタログレシピをカスタムレシピに変更
- 03計画したレシピから買い物リストを作成
- 04週の献立にレシピを整理
MCP 対応
MCP クライアントに Cookidoo のアカウント、レシピ、買い物リスト、献立、コレクション、Thermomix デバイスのツールを提供します。stdio と HTTP のトランスポートに対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
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.0COOKIDOO_EMAILCookidoo account e-mailCOOKIDOO_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 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/herp75/mcp-cookidoo:2.2.0stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
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_COUNTRY | fr | Cookidoo サイトの国コード(fr、de、gb、es、…) |
COOKIDOO_LANGUAGE | fr-FR | サイトの言語(例:de-DE)。ガイド付き調理の設定の記述にも使用されます |
COOKIDOO_DEVICE | —(自動検出) | Thermomix レシピの対象機種(TM5、TM6、TM7)。未設定の場合はアカウントに連携されたデバイスから選択され(TM6 が含まれる場合は TM6 のルールを使用)、それ以外は TM6 が選択されます |
COOKIDOO_IMAGE_DIRS | —(アップロード無効) | upload_custom_recipe_image が画像を読み込めるフォルダー。: で区切ります(Windows では ;) |
COOKIDOO_MCP_TRANSPORT | stdio | stdio または http(--transport と同じ) |
COOKIDOO_MCP_HOST | 127.0.0.1 | HTTP のバインドアドレス。ループバック以外のアドレスを使用するには COOKIDOO_MCP_TOKEN が必要です |
COOKIDOO_MCP_PORT | 8000 | HTTP ポート |
COOKIDOO_MCP_TOKEN | — | HTTP モード用のベアラートークン。32 文字以上(例:openssl rand -hex 32) |
COOKIDOO_TEST_EMAIL、COOKIDOO_TEST_PASSWORD | — | ライブテスト専用:専用のテストアカウント(ライブテストを参照) |
COOKIDOO_TEST_COUNTRY、COOKIDOO_TEST_LANGUAGE | ch、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_recipes | read | クエリ、材料、合計時間の上限でレシピを検索します |
get_recipe_details | read | IDでレシピの材料、手順、所要時間を取得します |
| カスタムレシピ | ||
list_custom_recipes | read | アカウントのカスタムレシピを一覧表示します |
get_custom_recipe | read | 編集可能なJSON形式でカスタムレシピを取得します |
generate_recipe_structure | read | Thermomix(TM5/TM6/TM7)用の新しいレシピを検証し、そのJSONを返します |
upload_custom_recipe | write | Thermomix用に、そのJSONからカスタムレシピを作成します |
update_custom_recipe | destructive | 既存のカスタムレシピをそのJSONで置き換えます |
copy_recipe_to_custom | write | カタログのレシピを新しいカスタムレシピにコピーし、アレンジできるようにします |
upload_custom_recipe_image | destructive | ローカル画像からカスタムレシピの写真を設定します(COOKIDOO_IMAGE_DIRSを参照) |
delete_custom_recipe † | destructive | カスタムレシピを完全に削除します |
| 買い物リスト | ||
get_shopping_list | read | レシピ、材料、手動で追加したアイテムを、チェック状態とIDとともに取得します |
add_recipes_to_shopping_list | write | カタログおよび/またはカスタムレシピの材料を追加します |
remove_recipes_from_shopping_list | destructive | レシピとその材料を削除します |
add_shopping_list_items | write | アイテムを手動で追加します(「牛乳」「レモン2個」など) |
edit_shopping_list_items | destructive | 手動で追加したアイテムの名前を変更します |
mark_shopping_list_items | write | アイテムにチェックを付ける、またはチェックを外します |
remove_shopping_list_items | destructive | 手動で追加したアイテムを削除します |
clear_shopping_list † | destructive | 買い物リスト全体を空にします |
| ミールプラン | ||
get_meal_plan_week | read | 指定した日から始まる7日間に予定されたレシピを取得します |
add_to_meal_plan | write | カタログおよび/またはカスタムレシピを指定した日の予定に追加します |
move_in_meal_plan | destructive | 予定されたレシピを別の日に移動します(失敗時はロールバックされます) |
remove_from_meal_plan | destructive | その日のレシピを削除します(レシピ自体は保持されます) |
| コレクション | ||
list_collections | read | 自分のコレクションとフォロー中のコレクションを、レシピとともに一覧表示します(ページ分けあり) |
follow_collection / unfollow_collection | write / destructive | Cookidooのコレクションをフォローまたはフォロー解除します |
create_collection | write | カスタムコレクションを作成します |
delete_collection † | destructive | カスタムコレクションを削除します(レシピ自体は保持されます) |
add_to_collection / remove_from_collection | write / destructive | カスタムコレクションのレシピを追加または削除します |
| Thermomix | ||
get_thermomix_modes | read | デバイスがサポートする設定とモードを、制限事項や例とともに取得します |
| アカウント | ||
connect_to_cookidoo | read | 設定を確認する/新たにログインし直します(任意。ツールは自動的にログインします) |
get_account_info | read | ユーザー、Cookidooのサイト、サブスクリプション、デバイスを取得します |
list_devices | read | アカウントにリンクされた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、TM7 | time(1秒~99分)、temperature(任意:「"37"」~「"95"」を5刻み、「"98"」、「"100"」~「"120"」を5刻み、またはTM6のみ「"varoma"」)、speed(温度を指定する場合は最大「"6"」)、reverse | 3 min/120°C/vitesse 1 | 3 Min./120°C/Stufe 1 |
dough | TM6、TM7 | time(最大20分) | Pétrin/2 min | Teig kneten/2 Min. |
browning | TM7 | time(最大30分)、temperature(「"140"」~「"160"」を5刻み)、power(gentle、intense) | Rissolage/5 min/160°C/intense | Anbraten/5 Min./160°C/Intensiv |
steaming | TM7 | time(最大99分)、speed(最大「"5"」)、reverse、accessory(varoma、simmering_basket、varoma_and_simmering_basket) | Cuisson vapeur/20 min/Varoma/vitesse 1 | Dampfgaren/20 Min./im Varoma/Stufe 1 |
turbo | TM6、TM7 | time(0.5、1、または2秒)、pulses(1~9、TM7のみ) | Turbo/0.5 sec/3 fois | Turbo/0.5 Sek./3x |
rice_cooker | TM6、TM7 | なし | Rice cooker | Reis kochen |
warm_up | TM6、TM7 | temperature(「"37"」~「"90"」)、speed("soft"、"1"、"2"。時間は指定できません。Cookidoo によって削除されます) | Réchauffage/65°C/vitesse 2 | Erwärmen/65°C/Stufe 2 |
blend | TM6、TM7 | time(10秒~5分)、speed(「"6"」~「"8"」) | Mixage/1 min/vitesse 8 | Pü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対応)がこのプロジェクトの形を作りました。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。