mcp-recipes について
mcp-recipesは、フランス語・英語・スペイン語の6つのレシピサイトを検索・閲覧できるMCPサーバーです。複数サイトの料理を比較し、分量を調整できます。
主な機能
- 016つのレシピサイトを一括検索
- 02統一形式でレシピを閲覧
- 03複数サイトの料理を比較
- 04材料と分量を調整
活用シーン
- 01複数サイトからレシピを探す
- 02フランス語版と英語版を比較
- 03人数に合わせて分量を変更
MCP 対応
MCPクライアントにsearch_recipes、get_recipe、compare_recipes、scale_ingredientsのツールを提供します。レシピの検索と閲覧では6つのサイトにアクセスします。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
4掲載時のツール一覧 · 今日に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| query | string | はい | ソースが公開に使用している任意の言語で料理名または食材名を指定します。 |
| fan_out | boolean | いいえ | 質問を短い表現に言い換えて送信してよいかどうかを指定します。有効にしてください。これらのインデックスは渡された語句を検索するため、料理についての情報を複数含むコーパスでは、文で書かれた質問が空の結果になることがあります。無効にすると、入力された語句だけが送信されます。その場合、`per_source` に送信されなかった表現が記載されます。 |
| sources | array | いいえ | 問い合わせるソースを id で指定します。省略すると、すべてのソースに問い合わせます。それがこのツールの用途です。id は `per_source` が報告するものです。 |
| limit_per_source | integer | いいえ | 各ソースから取得する行数です。1 つのソースだけでリスト全体が埋まるのを防ぎます。 |
詳細
mcp-recipes
レシピはさまざまなサイトに掲載されており、それぞれ独自の形式で書かれています。フランスの料理サイトはフランス語で、独自の計量単位や分量の考え方でレシピを公開しています。一方、英語のウィキ料理本には、前者には項目すらない調理器具の一覧や説明文があります。そのうち1つに質問しても、そのサイトの情報しか答えられません。
このサーバーは6つのサイトを読み取ります。フランス語のサイトはMarmiton、Ptitchef、Supertoinetteの3つ、英語のサイトはWikibooks CookbookとBBC Good Foodの2つ、スペイン語のサイトはPequerecetasです。1つの質問で全サイトを検索し、どのサイトのレシピも統一された形式で読み、同じ料理の複数のレシピを並べて比較し、材料の分量を調整できます。API キーもアカウントも必要ありません。
インストール
ワンクリックインストール
Claude Code
claude mcp add recipes -- npx -y mcp-recipes
Claude Desktop、Cursor、および標準の設定形式を使用するすべてのクライアント
{
"mcpServers": {
"recipes": {
"command": "npx",
"args": ["-y", "mcp-recipes"]
}
}
}
Node 24 以降が必要です。環境変数の設定は不要です。
Docker を使用する場合
{
"mcpServers": {
"recipes": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-recipes:4.0.0"]
}
}
}
-i はプロトコルが流れる標準入力を開いたままにするために指定し、TTY はストリームを書き換えてしまうため -t は指定しません。コンテナーに必要な外部 HTTPS 接続先は www.marmiton.org、api.wikimedia.org、www.ptitchef.com、www.bbcgoodfood.com、www.supertoinette.com、www.pequerecetas.com のみです。ボリューム、ポート、認証情報は必要ありません。
npm を使わずにバンドルを使用する
最新リリースから mcp-recipes-4.0.0.mcpb をダウンロードして開きます。MCP バンドルに対応しているクライアントであれば、npm や編集が必要な設定ファイルなしで、自動的にインストールされます。バンドルには依存関係が含まれているため、インストール時にダウンロードは発生しません。
質問できること
- 「どこでもいいので、カルボナーラのレシピを探して。」
- 「この料理のフランス語版と英語版を比較して。」
- 「2つ目を8人分にして。」
- 「この中でクリームを使っているのはどれ?」
- 「ノートにある材料リストを1.5倍にして。」
通常の流れは検索してから読み込むことです。各行には出典を示す id が含まれており、get_recipe に渡します。
出典
| 出典 | サイト | 言語 |
|---|---|---|
marmiton | www.marmiton.org | フランス語 |
cookbook | Wikibooks Cookbook | 英語 |
ptitchef | www.ptitchef.com | フランス語 |
goodfood | www.bbcgoodfood.com | 英語 |
supertoinette | www.supertoinette.com | フランス語 |
pequerecetas | www.pequerecetas.com | スペイン語 |
各行の id は出典を示すため、回答から取得した識別子を使えば、正しいサイトに戻れます。出典をまたいで件数を合算することはありません。また、失敗した出典は、何も見つからなかったのではなく、失敗したものとして報告されます。
各サイトには、それぞれのペースでアクセスします。2つのサイトではリクエストの間隔を3秒空ける必要があり、すべてのサイトに適用される設定は、最も遅いサイトが求める間隔よりも長くすることしかできません。
これらのサイトのうち2つでは、レシピの掲載場所にレシピ以外のものが掲載されています。Wikibooks Cookbookでは、食材に関するページが、その食材を使ったレシピの隣に置かれています。また、Pequerecetasでは、複数のレシピをまとめた記事が公開されています。検索結果にはその旨が示され、get_recipe はページから読み取った内容を示します。
ツール
| ツール | 機能 |
|---|---|
search_recipes | 1つの質問ですべての出典を検索します。 |
get_recipe | どの出典からも、統一された形式で1つのレシピを読み込みます。 |
compare_recipes | 同じ料理の複数のバージョンを並べて比較します。 |
scale_ingredients | どの材料リストも、サイトへのリクエストなしで分量を調整します。 |
search_recipes
1つの質問ですべての出典を検索します。
| 引数 | 型 | 必須 | 機能 |
|---|---|---|---|
query | 文字列、1〜200文字 | はい | 探したい料理または食材です。 |
limit_per_source | 整数、1〜25、デフォルトは 5 | いいえ | 各出典から保持する行数です。 |
sources | 出典 ID の配列 | いいえ | これらの出典だけに問い合わせます。 |
fan_out | ブール値、デフォルトは true | いいえ | 質問から導き出した、より短い表現も各出典に送信します。 |
返される内容: results には id を含む行があり、get_recipe に渡せます。source と source_name はその行を公開したサイトを示し、title、url、image_url、出典が提供している場合は excerpt も含まれます。per_source には各サイトのレポートが1つずつ含まれ、status は answered(回答済み)または failed(失敗)を示します。また、そのサイトが提供した count、サイト上での件数の数え方を示す reported_total_means と、それに対応する reported_total も含まれます。names_the_dish は、そのサイトの行のうち、タイトルに料理名が含まれている数を count に対する割合として示します。検索インデックスは渡された単語に応じて回答するため、サイトから行が提供されても、そのどれもが目的の料理とは限りません。order は、一覧がどのように作成されたかを文章で説明します。
get_recipe
あらゆるソースから、同じ形式でレシピを1つ読み取ります。
| 引数 | 型 | 必須 | 機能 |
|---|---|---|---|
id | string、1~500文字 | はい | 行に付与された識別子です。例:marmiton:44078。2つのソースではレシピを数字だけで指定するため、ソース名を付けて ID を指定してください。 |
servings | integer、1~500 | いいえ | 材料の分量を、この人数分に調整します。 |
sections | ingredients、steps、times、nutrition、tips、equipment の配列。デフォルトは ["ingredients", "steps"] | いいえ | 返す項目を指定します。 |
max_steps | integer、1~100。デフォルトは 20 | いいえ | 返す手順の数です。 |
max_gathered | integer、1~500。デフォルトは 30 | いいえ | レシピを集めたページから返すレシピと見出しの数です。 |
max_step_chars | integer、80~4000。デフォルトは 600 | いいえ | 手順ごとに保持する文字数です。 |
返される内容: kind は、指定先に含まれていた内容を示します。recipe の回答には
recipe が含まれ、collection は含まれません。collection の回答には collection が含まれ、
recipe は含まれません。これは、ほかのレシピを集めた記事で、その構成元となる
headings と、参照先の recipes が含まれています。各レシピは
get_recipe で読み取れます。
レシピは、どのソースが公開したかにかかわらず、すべてのソースが変換される共通形式で返されます。タイトル、アドレス、各行の scaling と is_equipment を含む材料、
手順、および指定された項目が含まれます。あるソースが公開していて別のソースには概念がないフィールドは、作り出されるのではなく、欠落した状態で返されます。rest_minutes は、休ませる時間をほかの時間とは分けて表示するソースから、その時間を取得します。それ以外の時間はここには含まれません。steps_as_one_block は、ソースが調理方法を手順ごとではなく、1つの文章ブロックとして公開していた場合にその旨を示します。withheld は、ソースが購読者向けに非公開にしている項目を示します。これはページには存在するものの、読み取れなかった項目ではありません。scaling_summary は、行数を4つの方法で集計したもので、その合計はリストの行数と一致します。手順が文の途中で切れている場合は、max_step_chars を増やしてください。
compare_recipes
同じ料理の複数のバージョンを並べて比較します。
| 引数 | 型 | 必須 | 説明 |
|---|---|---|---|
dish | string、1~200 文字 | はい | 比較する料理です。 |
servings | 整数、1~500 | いいえ | すべてのバージョンの分量を、この人数分に換算します。 |
sections | ingredients、steps、times、nutrition、tips、equipment の配列、デフォルトは ["ingredients"] | いいえ | 各バージョンで返す項目です。 |
max_steps | 整数、1~100、デフォルトは 10 | いいえ | 各バージョンで返す手順の数です。 |
max_step_chars | 整数、80~4000、デフォルトは 600 | いいえ | 各手順で保持する文字数です。 |
sources | ソース ID の配列 | いいえ | これらのソースのみを比較します。 |
戻り値: versions には、回答した各ソースのレシピが1つずつ含まれます。すべて同じ人数分に換算されるため、分量を相互に比較できます。また、differences には、それぞれの違いが含まれます。per_source には、検索時と同じ形式で各サイトの情報が記載されます。
scale_ingredients
サイトへのリクエストなしで、任意の材料リストを換算します。
| 引数 | 型 | 必須 | 説明 |
|---|---|---|---|
ingredients | 1~200 行の配列 | はい | 換算する行です。 |
factor | 数値、最大1000 | いずれか一方 | 適用する倍率です。 |
from_servings | 整数、1~500 | いずれか一方 | リストの元の人数分です。 |
to_servings | 整数、1~500 | いずれか一方 | 希望する人数分です。 |
language | auto、fr、en、es のいずれか、デフォルトは auto | いいえ | 各行の読み取りに使用する言語です。 |
factor を指定するか、from_servings と to_servings の組み合わせを指定してください。auto は各行を個別に読み取るため、複数の言語が混在するリストに適しています。言語を指定すると、すべての行をその言語として読み取ります。
戻り値: get_recipe が返す形式の換算済みの行。それぞれに scaling が含まれます。
分量の換算
分量は、それぞれに適した単位で示されるため、レシピで使用されている単位とは異なる単位で返される場合があります。たとえば、200 g に20を掛けると、4 kg になります。
材料をどれだけ細かく分割できるかは、材料によって異なります。バゲットは2つ、3つ、4つに切れますが、卵は分けられません。計算結果がその間の値になる場合は四捨五入されるため、換算後のレシピは元の配合から少しずれます。その行には rounded が付き、注記に処理内容が示されます。
ソースではそれぞれの言語で分量が記載されており、各行は記載された言語で読み取られます。数値はこのサーバーで計算したものなので、表示する際は再計算した値であることを明記してください。
回答で各ソースについて示す内容
すべての回答で、各ソースについて個別に説明します。失敗したサイト、誰も問い合わせなかったサイト、何も返さなかったサイトはそれぞれ異なるため、個別に報告します。合計数は、その数を公表したソースの情報とともに示します。ソースによって数える対象は異なり、カテゴリ全体を数えるサイトもあれば、提供した行数を数えるサイトもあり、合計数を公表しないサイトもあります。
設定
すべての変数は任意です。クライアント設定の env ブロックで設定してください。
| Variable | Default | What it does |
|---|---|---|
RECIPES_USER_AGENT | the project identity | サイトにアプリケーション名を伝え、担当者に連絡できるアドレスを指定します。 |
RECIPES_MIN_INTERVAL_MS | 1000 | 同じサイトへの2回のリクエスト間隔です。500~60000の範囲です。 |
RECIPES_TIMEOUT_MS | 20000 | 1回のリクエストのタイムアウト時間です。1000~120000の範囲です。 |
RECIPES_MAX_RETRIES | 3 | 一時的な失敗の後に再試行する回数です。0~8の範囲です。 |
RECIPES_CACHE_TTL_MS | 900000 | 回答をメモリに保持する時間です。0~86400000の範囲です。 |
RECIPES_CACHE_MAX_ENTRIES | 200 | 同時にメモリに保持する回答数です。1~5000の範囲です。 |
RECIPES_LOG_LEVEL | error | silent、error、info、debugのいずれかを指定します。stderrに出力されます。 |
範囲外の値はデフォルト値に置き換えられ、その理由がstderrに出力されます。
エラー
すべての失敗には、6つのコードのうち1つ、メッセージ、そして役立つ場合は次の対応を示すヒントが付随します。
| Code | What happened | What to do |
|---|---|---|
not_found | ソースは応答しましたが、そのレシピはありません。 | search_recipesで識別子を確認してください。 |
invalid_input | リクエストを送信する前に引数が拒否されました。 | 引数を示すメッセージを確認してください。 |
rate_limited | ソースから、このクライアントに速度を落とすよう求められました。 | 待ってから、同じ引数でもう一度呼び出してください。レシピは引き続き存在します。 |
parse_failure | ページは読み込まれましたが、想定されるコンテンツがありませんでした。 | 課題トラッカーで報告してください。 |
network_error | リクエストが完了しませんでした。 | 少し待ってから再試行してください。 |
timeout | リクエストがタイムアウトしました。 | RECIPES_TIMEOUT_MSを増やすか、取得する行数を減らしてください。 |
失敗したソースは、回答全体を失敗させるのではなく、ソースごとに報告されます。そのため、応答のなかったサイトによって他のサイトの結果が隠れることはありません。
ライブラリとして
サイトを読み取るレイヤーは、独自のアクセス間隔、キャッシュ、エラーを備えた単体のパッケージとして公開されており、プロトコルには依存しません。
import { RecipesClient } from "mcp-recipes/client";
const client = new RecipesClient();
const { rows, reports } = await client.searchRecipes("carbonara", 3);
console.log(
rows.length,
reports.map((report) => report.status),
);
const { recipe } = await client.getRecipe(rows[0].id);
searchRecipes(query, limitPerSource, sources?, options?) は
{ rows, reports } を返します。各ソースにつき 1 つのレポートがあり、応答したかどうかと、そのソース固有の件数を示します。そのため、失敗したソースがデータを保持していないかのように扱われることはありません。getRecipe(id) は { recipe, cached, read } を返し、6 種類のコードのいずれかを含むエラーをスローします。client.profiles には、ビルドで登録されたソースが一覧表示されます。
スケーラーは mcp-recipes/scale で個別に公開されており、オフラインで任意のリストに対して動作します。
import { scaleIngredients } from "mcp-recipes/scale";
scaleIngredients(["200 g de harina", "4 oeufs", "1 cup milk"], { factor: 2 });
各サイトには独自のアクセス間隔が設定されており、ここでも下限が適用されます。
アクセス間隔と出典表示
各サイトへのアクセス間隔は個別に設定され、同時に送るリクエストは 1 件までです。どのサイトにも設定では下回れない独自の下限があります。Marmiton と The Cookbook は 0.5 秒、Ptitchef と BBC Good Food は 1 秒、Supertoinette と Pequerecetas は 3 秒です。すべてのソースに適用する設定では、サイトごとの間隔を延ばすことはできますが、短縮することはできません。そのため、すべてのサイトに一度に問い合わせても、それぞれのサイトへのリクエストは 1 件であり、2 件にはなりません。User-Agent の末尾には必ずプロジェクトの識別情報と、連絡可能な宛先が含まれます。
各行には、レシピが掲載されたページのアドレスと、そのレシピを公開したサイト名が含まれます。The Cookbook のページは CC BY-SA 4.0 の下で公開されており、そのページをもとに作成したものも同じライセンスで共有するよう求めています。Marmiton、Ptitchef、BBC Good Food、Supertoinette、Pequerecetas はレシピページに利用条件を記載しておらず、レシピは各サイトと執筆した料理人に帰属します。記載がないことは許諾を意味しないため、出典のサイトを明記し、レシピを取得したページへのリンクを掲載してください。
BBC Good Food が購読者向けに提供しているレシピは、材料と作り方を含めず、ページのアドレスを添えて、閲覧できないレシピとして返されます。このサーバーは、そのサイトが販売することを選んだ内容を再構成しません。
サイトが公開している 2 つの指標は、ここでは再掲しません。難易度は各サイトが独自の表現で記載する言葉であり、どのサイトも共通の尺度を公開していないため、2 つの版を比較するための軸にはなりません。価格は、あるサイトではユーロ建ての金額ですが、別のサイトでは独自の一覧における順位です。両方を 1 つのフィールドに格納すると、比較を招くおそれがあります。
この MCP サーバーは非公式プロジェクトであり、参照先のいずれのサイトとも提携関係にありません。
プライバシー
このサーバーは、ユーザーに関する情報を収集せず、作成者にも何も送信しません。お使いのマシン上で実行され、www.marmiton.org、api.wikimedia.org、www.ptitchef.com、www.bbcgoodfood.com、www.supertoinette.com、www.pequerecetas.com にのみ接続します。実行中は応答をメモリに保持し、ディスクには何も書き込みません。PRIVACY.md には、リクエストに含まれる内容と、それを変更する設定が記載されています。
開発
npm install
npm run build:fixtures
npm test
npm run check
テストは生成されたフィクスチャに対して実行され、ネットワークリクエストは発生しません。ライブテストの npm run test:live は、ルートごとに 1 件のリクエストを送信し、毎晩各サイトに対して実行されます。
コントリビューション
バグ、質問、アイデアは イシュートラッカー までお寄せください。プルリクエストも歓迎します。まずイシューを立てていただくと、変更の方向性を合意しやすくなります。CONTRIBUTING.md をご覧ください。
ライセンス
MIT です。LICENSE をご覧ください。レシピは、それを公開したサイトとその作者に帰属します。
mcp-recipes(フランス語)
レシピはさまざまなサイトに掲載されており、それぞれ書き方が異なります。フランスの料理サイトはフランス語で、そのサイト独自の計量単位や一人前の考え方でレシピを公開しています。一方、英語の料理ウィキには、前者には対応する項目のない調理器具の一覧や説明文があります。どちらかに質問すれば、答えはそのサイトの内容に限られます。
このサーバーは6つのサイトを読み込みます。フランス語のサイトは、Marmiton、Ptitchef、Supertoinetteの3つ。英語のサイトは、Wikibooks の CookbookとBBC Good Foodの2つ。スペイン語のサイトは、Pequerecetasです。1つの質問で6つのサイトすべてを検索し、どのサイトのレシピも同じ形式で読み、同じ料理の複数のバージョンを並べて比較し、どの材料リストでも分量を調整できます。API キーもアカウントも不要です。
インストール
ワンクリックインストール
Claude Code
claude mcp add recipes -- npx -y mcp-recipes
Claude Desktop、Cursor、および標準設定形式に対応するすべてのクライアント
{
"mcpServers": {
"recipes": {
"command": "npx",
"args": ["-y", "mcp-recipes"]
}
}
}
Node 24 以降が必要です。環境変数の設定は不要です。
Docker を使う
{
"mcpServers": {
"recipes": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-recipes:4.0.0"]
}
}
}
-i は、プロトコルの通信路である標準入力を開いたままにします。TTY はストリームを書き換えるため、-t は省略します。コンテナには、www.marmiton.org、api.wikimedia.org、www.ptitchef.com、www.bbcgoodfood.com、www.supertoinette.com、www.pequerecetas.comへの HTTPS アウトバウンドアクセスだけが必要です。それ以外は不要です。ボリューム、ポート、認証情報は必要ありません。
npm を使わないバンドル
最新リリースからmcp-recipes-4.0.0.mcpbをダウンロードして開いてください。MCP バンドルに対応するクライアントであれば、自動でインストールされます。npm も、編集する設定ファイルも不要です。バンドルには依存関係が含まれているため、インストール時に何かがダウンロードされることはありません。
できること
- 「作れる場所を問わず、カルボナーラのレシピを探して。」
- 「この料理のフランス語版と英語版を比べて。」
- 「2つ目のレシピを8人分にして読んで。」
- 「クリームを使っているのはどれ?」
- 「私のノートにあるこの材料リストを1.5倍にして。」
通常は検索してからレシピを読みます。検索結果の各行には、出典を示すidがあり、get_recipeにそのまま渡せます。
ソース
| ソース | サイト | 言語 |
|---|---|---|
marmiton | www.marmiton.org | フランス語 |
cookbook | Cookbook Wikibooks | 英語 |
ptitchef | www.ptitchef.com | フランス語 |
goodfood | www.bbcgoodfood.com | 英語 |
supertoinette | www.supertoinette.com | フランス語 |
pequerecetas | www.pequerecetas.com | スペイン語 |
各行のidはソースを示すため、レスポンスで読み取った識別子を使って正しいサイトに戻れます。件数をソース間で合算することはありません。また、失敗したソースは、何も見つからなかったのではなく、失敗したものとして報告されます。
各サイトには、それぞれのペースでアクセスします。2つのサイトではリクエストの間隔を3秒空けるよう求められており、すべてのサイトに適用する設定では、最も遅いサイトの要求よりもサーバーをさらに慎重にすることしかできません。
これらのサイトのうち2つでは、レシピの掲載場所にレシピ以外のものもあります。Wikibooks Cookbookには、レシピで使われる材料についてのページがレシピのそばに掲載されており、Pequerecetasには複数のレシピをまとめた記事があります。検索結果にはその旨が示され、get_recipeではページから読み取った内容が示されます。
ツール
| ツール | 機能 |
|---|---|
search_recipes | 1つの質問で、すべてのソースを検索します。 |
get_recipe | どのソースのレシピも、統一された形式で読み取ります。 |
compare_recipes | 同じ料理の複数のバージョンを並べて比較します。 |
scale_ingredients | リクエストを送らずに、あらゆる材料リストの分量を調整します。 |
search_recipes
1つの質問で、すべてのソースを検索します。
| 引数 | 型 | 必須 | 機能 |
|---|---|---|---|
query | 文字列、1~200文字 | はい | 検索する料理または材料です。 |
limit_per_source | 整数、1~25、デフォルトは5 | いいえ | 各ソースから保持する行数です。 |
sources | ソース識別子の配列 | いいえ | これらのソースだけに問い合わせます。 |
fan_out | ブール値、デフォルトはtrue | いいえ | 質問から短い表現も取り出し、各ソースに送信します。 |
返される内容: get_recipeが引き継ぐ、idを持つ行のresultsです。sourceとsource_nameは、その行を公開したサイトを示します。ほかに、title、url、image_url、およびソースにある場合はexcerptが含まれます。
per_sourceにはサイトごとのレポートが含まれます。statusはansweredまたはfailed、countは返された件数、reported_totalとreported_total_meansは、そのサイトにおいてこの数が何を数えているかを示します。
names_the_dishは、サイトごとに、タイトルに料理名が含まれる行の数をcountに対する割合で示します。検索インデックスは入力された語句に応じて結果を返すため、料理そのものではない行がサイトから返されることがあります。orderは、リストの作成方法を文章で説明します。
get_recipe
任意のソースからレシピを、統一された形式で読み取ります。
| 引数 | 型 | 必須 | 内容 |
|---|---|---|---|
id | 文字列、1~500文字 | はい | 行の識別子。たとえば marmiton:44078 です。2つのソースではレシピを数字のみで指定するため、ソース名を付けてIDを記述してください。 |
servings | 整数、1~500 | いいえ | この人数分に合わせて材料を調整します。 |
sections | ingredients、steps、times、nutrition、tips、equipmentの配列。既定値は["ingredients", "steps"] | いいえ | 返すセクションです。 |
max_gathered | 整数、1~500。既定値は30 | いいえ | レシピをまとめたページの場合に返すレシピと小見出しの数です。 |
max_steps | 整数、1~100。既定値は20 | いいえ | 返す手順の数です。 |
max_step_chars | 整数、80~4000。既定値は600 | いいえ | 手順ごとに保持する文字数です。 |
戻り値: kindは、そのアドレスが示す内容を表します。recipeの応答にはrecipeが含まれ、collectionは含まれません。collectionの応答にはcollectionが含まれ、recipeは含まれません。後者は他のレシピをまとめた記事で、記事を構成するheadingsと、get_recipeでそれぞれ読み取れるリンク先のrecipesが含まれます。
レシピは、公開元にかかわらず、すべてのソースで統一された形式で返されます。内容は、タイトル、アドレス、各行のscalingとis_equipmentを含む材料、手順、および指定されたセクションです。あるソースにはあるものの、別のソースには概念自体がないフィールドは、作り出さずに省略されます。rest_minutesには、休憩時間を別途表示するソースの休憩時間が入り、ここで返される他の時間には含まれません。steps_as_one_blockは、ソースが調理方法を手順ごとではなく、1つの文章ブロックとして公開している場合にそのことを示します。scaling_summaryは4種類の方法で行数を集計し、その合計はリスト全体の行数になります。withheldは、ソースが購読者向けに限定しているセクションを示します。これはページに存在するものの、読み取れないセクションとは異なります。手順が文の途中で切れている場合は、max_step_charsを増やしてください。
compare_recipes
同じ料理の複数のバージョンを並べて比較します。
| 引数 | 型 | 必須 | 説明 |
|---|---|---|---|
dish | 文字列、1~200 文字 | はい | 比較する料理です。 |
servings | 整数、1~500 | いいえ | 各バージョンの分量をこの人数分に調整します。 |
sections | ingredients、steps、times、nutrition、tips、equipment の配列、デフォルトは ["ingredients"] | いいえ | 各バージョンに表示する項目です。 |
max_steps | 整数、1~100、デフォルトは 10 | いいえ | 各バージョンで提示する手順の数です。 |
max_step_chars | 整数、80~4000、デフォルトは 600 | いいえ | 各手順に残す文字数です。 |
sources | ソース ID の配列 | いいえ | 指定したソースだけを比較します。 |
戻り値: versions は、応答した各ソースにつき1つのレシピです。すべて同じ人数分に
調整されるため、各レシピの分量を相互に比較できます。differences は、それぞれの違いです。
per_source には、検索時と同じように各サイトの情報が含まれます。
scale_ingredients
どのサイトにも問い合わせることなく、任意の材料リストの分量を調整します。
| 引数 | 型 | 必須 | 説明 |
|---|---|---|---|
ingredients | 1~200 行の配列 | はい | 分量を調整する行です。 |
factor | 数値、最大1000 | どちらか一方 | 適用する倍率です。 |
from_servings | 整数、1~500 | どちらか一方 | 元のリストの人数分です。 |
to_servings | 整数、1~500 | どちらか一方 | 調整後の人数分です。 |
language | auto、fr、en、es のいずれか、デフォルトは auto | いいえ | 各行の読み取り方法です。 |
factor を渡すか、from_servings と to_servings の組み合わせを渡してください。auto は各行を個別に読み取るため、複数の言語が混在するリストに適しています。言語を指定すると、すべての行をその言語で読み取ります。
戻り値: get_recipe が返す形式で調整された行が含まれます。各行には scaling と
is_equipment が含まれます。is_equipment は、ツールの名前を示す行を変更せずに残す場合に真となります。scaled_count、rounded_count、unscaled_count、equipment_count は、送信された行の合計数を示します。
分量の調整
分量は、適切な単位で表されます。調整後は、レシピとは異なる単位で表示されることがあります。たとえば、200 g に20を掛けると 4 kg になります。
食材をどの程度の細かさに分けられるかは、その性質によって異なります。バゲットなら2つ、3つ、または4つに分けられますが、卵は分けられません。そのため、分量がその中間になった場合は丸められ、調整後のレシピは元のレシピの比率から少しずれます。その行には rounded が付き、注記にどのように調整したかが記されます。
ソースはそれぞれの言語で分量を記載し、行は記載された言語のまま表示されます。数値の計算はこのサーバーが行うため、表示する際は再計算したことを伝えてください。
ソースについて回答で伝えること
各回答では、ソースごとに個別の状況を報告します。失敗したサイト、照会されなかったサイト、空の応答を返したサイトはそれぞれ異なるため、その違いが分かるように報告します。合計数は、その数を公開したソースに紐づけ、そのソースが何を数えているかも伝えます。たとえば、あるソースはカテゴリ全体を数え、別のソースは提供した行を数え、さらに別のソースは合計数を公開していません。
設定
各変数はすべて任意です。クライアント設定の env ブロックに設定します。
| 変数 | 既定値 | 説明 |
|---|---|---|
RECIPES_USER_AGENT | プロジェクトの識別情報 | サイトにアプリケーション名を伝え、担当者への連絡先を提示します。 |
RECIPES_MIN_INTERVAL_MS | 1000 | 同じサイトへのリクエスト間隔。500~60000の範囲です。 |
RECIPES_TIMEOUT_MS | 20000 | リクエストのタイムアウト。1000~120000の範囲です。 |
RECIPES_MAX_RETRIES | 3 | 一時的な失敗後の再試行回数。0~8の範囲です。 |
RECIPES_CACHE_TTL_MS | 900000 | 応答をメモリに保持する期間。0~86400000の範囲です。 |
RECIPES_CACHE_MAX_ENTRIES | 200 | 同時にメモリに保持する応答数。1~5000の範囲です。 |
RECIPES_LOG_LEVEL | error | silent、error、info、debugのいずれか。エラー出力に書き込みます。 |
範囲外の値は既定値に戻され、その理由がエラー出力に書き込まれます。
エラー
各失敗には6つのコードのいずれかとメッセージが付いており、役立つ場合は次の操作の案内も含まれます。
| コード | 起きたこと | 対処 |
|---|---|---|
not_found | ソースから応答がありましたが、そのレシピはありません。 | search_recipes で識別子を確認してください。 |
invalid_input | リクエストを送信する前に引数が拒否されました。 | 引数名が記載されたメッセージを読んでください。 |
rate_limited | ソースがこのクライアントに速度を落とすよう求めています。 | 待ってから、同じ引数でもう一度呼び出してください。レシピは引き続き存在します。 |
parse_failure | ページは読み込まれましたが、期待されたコンテンツがありません。 | 課題トラッカーで報告してください。 |
network_error | リクエストが完了しませんでした。 | 少し待ってから再試行してください。 |
timeout | リクエストがタイムアウトしました。 | RECIPES_TIMEOUT_MS を増やすか、取得する行数を減らしてください。 |
失敗したソースはレスポンス全体を失敗させるのではなく、ソースごとに報告されるため、応答しないサイトによって別のサイトの情報が隠されることはありません。
ライブラリとして
サイトを読み取るレイヤーは、それ自体のアクセス間隔、キャッシュ、エラー処理を備え、プロトコルとは独立して公開されています。
import { RecipesClient } from "mcp-recipes/client";
const client = new RecipesClient();
const { rows, reports } = await client.searchRecipes("carbonara", 3);
console.log(
rows.length,
reports.map((report) => report.status),
);
const { recipe } = await client.getRecipe(rows[0].id);
searchRecipes(query, limitPerSource, sources?, options?) は { rows, reports } を返します。レポートはソースごとにあり、応答したかどうかと、そのソース独自の件数を示します。そのため、失敗したソースが、何も保持していないソースのように見えることはありません。getRecipe(id) は { recipe, cached, read } を返し、6つのコードのいずれかを持つエラーをスローします。client.profiles には、この構成で登録されたソースが列挙されます。
スケーリング機能は mcp-recipes/scale として別途公開されており、任意のリストをオフラインで処理します。
import { scaleIngredients } from "mcp-recipes/scale";
scaleIngredients(["200 g de harina", "4 oeufs", "1 cup milk"], { factor: 2 });
各サイトは独自のアクセス間隔を維持し、ここでも下限が適用されます。
ペースと帰属表示
各サイトへのアクセス間隔はサイトごとに管理され、一度に1件のリクエストを送信します。各サイトには独自の最低間隔があり、どの設定でもこれを下回ることはありません。Marmiton と Cookbook は0.5秒、Ptitchef と BBC Good Food は1秒、Supertoinette と Pequerecetas は3秒です。すべてのソースに適用する設定によって、サイトごとの間隔を広げることはできますが、狭めることはできません。そのため、すべてのサイトに同時に問い合わせても、それぞれへのリクエストは1件であり、2件にはなりません。User-Agent の末尾には、必ずプロジェクトの識別情報と連絡先のメールアドレスを記載します。
各行には、レシピページのアドレスと、そのレシピを公開したサイト名が記載されています。Cookbook のページは CC BY-SA 4.0 ライセンスで公開されており、これを基に作成したものも同じライセンスで共有することが求められます。Marmiton、Ptitchef、BBC Good Food、Supertoinette、Pequerecetas は、レシピページに利用条件を記載していません。レシピの権利は、これらのサイトと執筆した料理人に帰属します。記載がないからといって許可されているわけではありません。サイト名を明記し、レシピの出典ページにリンクしてください。
BBC Good Food が購読者限定としているレシピについては、材料と作り方を含めず、掲載を見送ったレシピとして名前とページのアドレスを返します。このサーバーは、サイトが有料で提供することを選んだ内容を再現しません。
サイトが公開している数値のうち、ここでは2つを採用していません。難易度は、各サイトがそれぞれ独自の表現で記載しているもので、共通の尺度は公開されていません。そのため、異なるサイトのレシピを比較するための指標にはなりません。費用は、あるサイトではユーロ建ての価格、別のサイトでは独自の一覧における順位です。これらを1つのフィールドにまとめると、比較できるものとして誤解されるおそれがあります。
この MCP は非公式のプロジェクトであり、読み取り対象のいずれのサイトとも関係ありません。
プライバシー
このサーバーは、ユーザーに関する情報を収集せず、作者にも何も送信しません。お使いのマシン上で動作し、www.marmiton.org、api.wikimedia.org、
www.ptitchef.com、www.bbcgoodfood.com、www.supertoinette.com、
www.pequerecetas.com にのみ接続します。動作中はレスポンスをメモリに保持し、ディスクには何も書き込みません。PRIVACY.md では、リクエストに含まれる情報と、その内容を変える設定について説明しています。
開発
npm install
npm run build:fixtures
npm test
npm run check
テストは生成されたフィクスチャに対して実行され、リクエストは送信しません。ライブテストスイート npm run test:live は、ルートごとに1件のリクエストを送信し、毎晩、各サイトに対して実行されます。
貢献
不具合、質問、アイデアはイシュートラッカーにお寄せください。変更の提案も歓迎します。まずチケットを作成すると、変更内容について合意しやすくなります。CONTRIBUTING.mdをご覧ください。
ライセンス
MIT。詳細はLICENSEをご覧ください。レシピの権利は、公開したサイトとその執筆者に帰属します。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。