mcp-ptitchef について
mcp-ptitchefは、フランスの料理サイトPtitchefをチャットクライアントから利用できるようにします。レシピ検索と人数分への換算、手持ちの食材からの料理探し、カテゴリや定番リストの閲覧、他言語版の確認に対応します。APIキーやアカウントは不要です。
主な機能
- 01料理名・食材によるレシピ検索
- 02手持ちの食材から料理を検索
- 03カテゴリと定番リストの閲覧
- 04レシピ取得と人数分への換算
- 05他言語版の確認
- 06任意の材料リストの換算
活用シーン
- 01冷蔵庫の食材で作れる料理探し
- 02人数に合わせたレシピ分量の調整
- 03高評価または新着レシピの検索
- 04レシピの他言語版の有無を確認
MCP 対応
MCP サーバーとして、レシピ検索・取得、カテゴリやリストの閲覧、食材照合、分量換算、翻訳情報の取得ツールを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
7掲載時のツール一覧 · 今日に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| limit | integer | いいえ | 表示する項目数。デフォルトは 20、最大は 200 です。この数を超える項目を持つ階層ではその旨が示され、「categories_published」には常にページに掲載された数が示されます。 |
| family | string | いいえ | 開くファミリーの slug。前回の呼び出しで取得した値を指定します。省略するとファミリー自体を読み込みます。ここがツリーの起点です。 |
詳細
mcp-ptitchef
Ptitchef は、家庭の料理好きがレシピを投稿するフランスの料理サイトです。各レシピには、材料、手順(一つずつ写真が掲載されていることもよくあります)、準備時間と調理時間、費用、栄養成分、読者による評価が記載されています。サイトでは材料の種類ごとにレシピを分類し、多くのレシピを複数の言語で公開しています。
このサーバーを使うと、チャットクライアントをこのサイトに接続できます。カテゴリのツリーをたどったり、料理名や材料でレシピを検索したり、カテゴリやサイトの定番リストを閲覧したり、冷蔵庫にあるもので何が作れるか尋ねたり、食卓の人数に合わせて材料の分量を調整したレシピを読んだり、レシピが公開されているほかの言語を探したりできます。API キーもアカウントも必要ありません。
インストール
ワンクリックインストール
Claude Code
claude mcp add ptitchef -- npx -y mcp-ptitchef
Claude Desktop、Cursor、および標準の設定形式を使うすべてのクライアント
{
"mcpServers": {
"ptitchef": {
"command": "npx",
"args": ["-y", "mcp-ptitchef"]
}
}
}
Node 24 以降が必要です。環境変数の設定は不要です。
Docker を使用
{
"mcpServers": {
"ptitchef": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-ptitchef:1.0.1"]
}
}
}
-i は、プロトコルが流れる標準入力を開いたままにします。TTY はストリームを書き換えるため、-t は指定しません。コンテナに必要なのは www.ptitchef.com への送信 HTTPS 接続だけです。ボリューム、ポート、認証情報は不要です。
npm を使わずにバンドルを使用
最新のリリースから mcp-ptitchef-1.0.1.mcpb をダウンロードして開きます。MCP バンドルに対応したクライアントであれば、npm も設定ファイルの編集も不要で、自動的にインストールされます。バンドルには依存関係が含まれているため、インストール時に何もダウンロードされません。
質問できること
- « Ptitchefにはケールを使ったレシピがありますか? »
- "ズッキーニ、フェタチーズ、ミントで何が作れますか?"
- "8人分のグラタンを読み上げてください。"
- "サイトで最も評価の高いレシピを見せてください。"
- "そのレシピはスペイン語でも公開されていますか?"
Ptitchefはフランスのサイトなので、レシピはフランス語で見つかります。通常は、一覧からレシピへ進みます。一覧の各行にはidがあり、get_recipeにはそのIDを渡します。
ツール
| ツール | 機能 |
|---|---|
list_categories | サイトが分類している食材ファミリーのツリーをたどります。 |
search_recipes | 料理名または食材からレシピを検索します。 |
browse_recipes | カテゴリページをページごとに、または固定リストとして読み込みます。 |
search_by_ingredients | 手元にある食材で何が作れるかを調べます。 |
get_recipe | リクエストに応じた人数分に調整したレシピを読み込みます。 |
scale_ingredients | サイトにリクエストせずに、任意の材料リストの分量を調整します。 |
get_recipe_translations | レシピが公開された他の言語を一覧表示します。 |
list_categoriesから始めてください。 サイトから適切なURLが返されるため、自分でURLを組み立てる必要はありません。自分で組み立てたURLでは、サイトのトップページに移動してしまいます。
list_categories
サイトがレシピを分類しているツリーを読み込みます。引数を指定しない場合はファミリーが返されます。ファミリーのスラッグをfamilyとして渡すと、その中のカテゴリを読み込めます。
| 引数 | 型 | 必須 | 機能 |
|---|---|---|---|
family | string、1~80文字 | いいえ | ファミリーのスラッグです。配下のカテゴリを読み込みます。 |
limit | integer、1~200、デフォルトは20 | いいえ | 返す行数です。 |
戻り値: slugを含む行です。これはfamilyまたはcategoryとして返されます。また、サイト独自の表記によるtitle、url、ページに説明がない場合はnullとなるdescription、および1階層下のカテゴリを示すsample_childrenが含まれます。
search_recipes
料理名または食材でレシピを検索します。
| 引数 | 型 | 必須 | 機能 |
|---|---|---|---|
query | string、1~120文字 | はい | フランス語で料理名または食材を指定します。 |
limit | integer、1~100、デフォルトは20 | いいえ | 返す行数です。 |
戻り値: resultsには、id、title、url、image_url、rating、rating_count、およびページには表示されずnullとなるカウンターreview_countを含む行が入ります。エンベロープにはサイトがどのように回答したかが示されます。独自のカテゴリページから回答された場合、kindはcategoryとなり、そのカテゴリ全体の件数がtotal_availableに入ります。サイト独自の形式で単一ページに回答された場合はfree_textとなり、合計件数は返された行数です。この2つの合計は、それぞれ異なるものを数えています。手作業で作成されたトピックの場合、kindはguideとなり、各行には名前とURLが含まれますが、合計件数はありません。さらに、result_count、rows_seen、page、single_page、urlも返されます。single_pageと表示されている一覧で、合計件数がrows_seenを上回る場合、サイトは残りの件数を数えていますが、その分は返しません。
browse_recipes
カテゴリのページを指定したページ番号で読み込むか、サイトの定番リストのいずれかを読み込みます。
| 引数 | 型 | 必須 | 説明 |
|---|---|---|---|
category | 1~120文字の文字列 | いいえ | list_categories が公開しているカテゴリースラッグです。 |
listing | latest、top_rated、または most_viewed | いいえ | カテゴリの代わりに読み込む定番リストです。 |
page | 1~1000の整数 | いいえ | 読み込むカテゴリのページです。定番リストのページは1つです。 |
limit | 整数、1~100、デフォルトは 20 | いいえ | 取得する行数です。 |
返される内容: search_recipes が返すエンベロープで、kind は
category、standing、または topic です。page はサイトが返したページで、
指定されたページが最終ページを超えている場合は最初のページに戻ります。
search_by_ingredients
料理人が手元に持っている食材で作れる料理を返します。
| 引数 | 型 | 必須 | 説明 |
|---|---|---|---|
ingredients | 1~5個の文字列の配列、各1~60文字 | はい | 手元にある食材をフランス語で指定します。 |
limit | 整数、1~100、デフォルトは 20 | いいえ | 取得する行数です。 |
返される内容: ほかのリストが返すエンベロープで、kind は
fridge です。サイトは独自の語彙で照合するため、表記が異なる食材を指定すると、
結果は広がるのではなく絞り込まれます。
get_recipe
1つのレシピを全文読み込み、分量が指定されている場合は食材の量を調整します。
| 引数 | 型 | 必須 | 説明 |
|---|---|---|---|
id | 1~300文字の文字列 | はい | 検索結果またはリストの行にある id です。 |
servings | 1~500の整数 | いいえ | この人数分に合わせて食材の量を調整します。 |
返される内容: title、url、description、image_url、category、cuisine、
サイト独自の表記による difficulty、author、published、modified、
rating、rating_count、review_count、prep_minutes、cook_minutes、
total_minutes、指定された分量について公開されている nutrition、
estimated_cost、keywords、faq、translations が含まれます。ページに記載がない
項目はそれぞれ null になります。steps には調理方法が手順ごとに1行で入り、
illustrated_steps には同じ手順に、サイトが各手順について撮影した写真が付きます。
yield にはレシピが想定している分量と、調整後の分量が示されます。各食材には
scaling が付き、値は scaled、rounded、unscaled のいずれかです。
数量を引用する前に確認してください。rounded は台所で使いやすいように調整されています。
scale_ingredients
サイトにリクエストせず、フランス語の材料行のリストに同じ計算を適用します。
| 引数 | 型 | 必須 | 説明 |
|---|---|---|---|
ingredients | 1~100 個の文字列の配列、各文字列は最大 300 文字 | はい | 分量を調整する材料行です。 |
factor | 0 より大きく 100 以下の数値 | いずれか一方 | 適用する倍率です。 |
from_servings | 0 より大きく 500 以下の数値 | いずれか一方 | リストに記載された分量の対象人数です。 |
to_servings | 0 より大きく 500 以下の数値 | いずれか一方 | 希望する分量の対象人数です。 |
factor、または from_servings と to_servings の組み合わせを指定します。
返されるもの: 使用した factor、get_recipe が返す形式で分量を調整した ingredients、および scaled_count、rounded_count、unscaled_count です。
get_recipe_translations
サイト自身が公開している対応関係を使って、レシピが公開されている他の言語を一覧表示します。
| 引数 | 型 | 必須 | 説明 |
|---|---|---|---|
id | 1~300 文字の文字列 | はい | 検索結果または一覧の行の id です。 |
返されるもの: サイトが公開している language タグと、その言語版の url を含む translations、translation_count、および参照元のフランス語ページの url です。
分量の調整
分量は適した単位で示されるため、レシピで使われている単位とは異なる単位で行が返される場合があります。たとえば、200 g に 20 を掛けると 4 kg になります。
材料をどの程度細かく分けられるかは、材料によって異なります。バゲットは 2 等分、3 等分、4 等分できますが、卵は分けられません。分量がその中間の値になる場合は四捨五入されるため、調整後のレシピは元の比率から少しずれます。その行には rounded が付き、note に処理内容が記されます。
数値はこのサーバーで計算した値なので、提示する際には再計算された値であることを伝えてください。ページに人数が記載されていないレシピは、人数に合わせて調整できず、その旨が回答に示されます。
設定
すべての変数は任意です。クライアント設定の env ブロックに設定してください。
| 変数 | デフォルト | 説明 |
|---|---|---|
PTC_USER_AGENT | プロジェクトの識別情報 | サイトにアプリケーション名と、担当者に連絡できる連絡先を伝えます。 |
PTC_MIN_INTERVAL_MS | 1500 | 2 つのリクエスト間の間隔です。範囲は 1000~60000 です。 |
PTC_TIMEOUT_MS | 20000 | 1 回のリクエストのタイムアウトです。範囲は 1000~120000 です。 |
PTC_MAX_RETRIES | 3 | 一時的な失敗後の再試行回数です。範囲は 0~8 です。 |
PTC_CACHE_TTL_MS | 900000 | ページをメモリ内に保持する時間です。範囲は 0~86400000 です。 |
PTC_CACHE_MAX_ENTRIES | 200 | 一度にメモリ内に保持するページ数です。範囲は 1~5000 です。 |
PTC_MAX_BODY_BYTES | 8000000 | 全体を読み込むレスポンスの最大サイズです。範囲は 100000~64000000 です。 |
PTC_BUDGET_MS | 60000 | 再試行と待機を含む、1 回の読み取りが応答を返すまでに使える時間です。範囲は 5000~600000 です。 |
PTC_LOG_LEVEL | error | silent、error、info、debug のいずれかです。stderr に出力されます。 |
範囲外の値はデフォルト値に置き換えられ、その理由が stderr に出力されます。
エラー
すべての失敗には、6 種類のコードのいずれか、メッセージ、および必要に応じて次の手順を示すヒントが含まれます。
| コード | 発生したこと | 対処方法 |
|---|---|---|
not_found | サイトから応答がありましたが、そのレシピやページはありません。 | list_categories でスラッグを確認するか、検索で ID を確認してください。 |
invalid_input | リクエストを送信する前に引数が拒否されました。 | 引数を示しているメッセージを読んでください。 |
rate_limited | サイトから、このクライアントに速度を落とすよう求められました。 | ヒントに示された秒数だけ待ち、同じ引数で再度呼び出してください。レシピは引き続き存在します。 |
parse_failure | ページは読み込まれましたが、想定したコンテンツがありませんでした。 | 課題トラッカーに報告してください。 |
network_error | リクエストが完了しませんでした。 | 少し待ってから再試行してください。 |
timeout | リクエストがタイムアウトまたは予算の上限に達しました。 | PTC_TIMEOUT_MS または PTC_BUDGET_MS を増やすか、取得する行数を減らしてください。 |
ライブラリとして
サイトを読み取るレイヤーは、独自のペーシング、キャッシュ、エラーを備え、プロトコルに依存しない形で単独で公開されています。
import { PtitchefClient } from "mcp-ptitchef/client";
const client = new PtitchefClient();
const { data, cached } = await client.listCategories();
console.log(data.results.length, cached);
listCategories、searchRecipes、browseRecipes、searchByIngredients、getRecipe はそれぞれ { data, cached } を返し、6 種類のコードのいずれかを含むエラーをスローします。2 つのリクエスト間の最低間隔も、ここで適用されます。
リクエスト間隔と出典情報
リクエストは一度に1件ずつ送信し、間隔は最低1.5秒空けます。サーバーの設定にかかわらず、間隔が1秒未満になることはありません。User-Agent の末尾には常に、プロジェクトの識別情報と連絡可能な宛先が含まれます。
各結果には、読み取ったページのアドレスが含まれ、source にはサイト名が記載されます。レシピ、タイトル、カテゴリーはPtitchefと、それらを執筆した料理人のものです。
このMCPサーバーは非公式プロジェクトであり、Ptitchefとは一切関係ありません。
プライバシー
このサーバーはユーザーに関する情報を収集せず、作者に何も送信しません。お使いのマシン上で動作し、www.ptitchef.com のみに接続します。実行中は回答をメモリ内に保持し、ディスクには何も書き込みません。
PRIVACY.md には、リクエストに含まれる内容と、それに影響する設定が記載されています。
開発
npm install
npm run build:fixtures
npm test
npm run check
テストは生成されたフィクスチャに対して実行され、ネットワークリクエストは行いません。ライブテストスイートの
npm run test:live は、ルートごとに1件のリクエストを送信し、毎晩サイト自体に対して実行されます。
貢献
バグ、質問、アイデアは イシュートラッカー にお寄せください。プルリクエストも歓迎します。まずイシューを作成すると、変更の方向性について合意しやすくなります。CONTRIBUTING.md をご覧ください。
ライセンス
MITです。LICENSE をご覧ください。レシピはPtitchefおよび各著者のものです。
mcp-ptitchef(フランス語)
Ptitchef は、料理人がレシピを投稿するフランスの料理サイトです。各レシピには、材料、手順(一つひとつ写真付きの場合もあります)、準備時間と調理時間、費用、栄養価、読者が付けた評価が記載されています。サイトでは、材料の種類ごとにレシピを分類し、多くのレシピを複数の言語で公開しています。
このサーバーは、会話型クライアントをこのサイトに接続します。カテゴリーの階層をたどったり、料理名や材料でレシピを検索したり、カテゴリーやサイトの常設リストを読んだり、冷蔵庫にあるもので何が作れるか尋ねたり、人数に合わせて材料を調整したレシピを読んだり、レシピが公開されている他の言語を調べたりできます。APIキーもアカウントも必要ありません。
インストール
ワンクリックでインストール
Claude Code
claude mcp add ptitchef -- npx -y mcp-ptitchef
Claude Desktop、Cursor、および標準設定形式に対応したすべてのクライアント
{
"mcpServers": {
"ptitchef": {
"command": "npx",
"args": ["-y", "mcp-ptitchef"]
}
}
}
Node 24以降が必要です。環境変数の設定は不要です。
Dockerを使用する場合
{
"mcpServers": {
"ptitchef": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-ptitchef:1.0.1"]
}
}
}
-i はプロトコルの通信路となる標準入力を開いたままにします。TTYはストリームを書き換えるため、-t は省略します。コンテナには www.ptitchef.com へのHTTPS送信アクセスのみが必要で、それ以外は必要ありません。ボリューム、ポート、認証情報はいずれも不要です。
npm不要のバンドル
最新リリース から mcp-ptitchef-1.0.1.mcpb をダウンロードして開いてください。MCPバンドルに対応したクライアントなら、自動でインストールされます。npmも、変更が必要な設定ファイルも不要です。バンドルには依存関係が含まれているため、インストール時に何もダウンロードされません。
質問できること
- 「Ptitchef にはケールのレシピがどんなものがありますか?」
- 「ズッキーニ、フェタチーズ、ミントで何を作れますか?」
- 「このグラタンのレシピを、8人分で読み上げてください。」
- 「このサイトで評価が最も高いレシピを見せてください。」
- 「このレシピはスペイン語でも公開されていますか?」
Ptitchef はフランスのサイトなので、レシピはフランス語で掲載されています。
通常の流れは、一覧からレシピを選ぶことです。一覧の項目には id があり、
get_recipe にその識別子を渡します。
ツール
| ツール | 機能 |
|---|---|
list_categories | サイトの食材カテゴリーの階層をたどります。 |
search_recipes | 料理名や食材からレシピを検索します。 |
browse_recipes | カテゴリーをページごとに、または固定の一覧で読み込みます。 |
search_by_ingredients | 手持ちの食材で作れる料理を検索します。 |
get_recipe | レシピを読み込み、指定に応じて分量を調整します。 |
scale_ingredients | サイトに問い合わせずに、任意の材料一覧の分量を調整します。 |
get_recipe_translations | レシピがほかのどの言語で公開されているかを一覧表示します。 |
まず list_categories を使ってください。 サイトから正しい URL が返されるため、
手動で作成する必要がありません。URL を手動で作成すると、サイトのホームページに
移動してしまいます。
list_categories
サイトがレシピを分類している階層を読み込みます。引数なしで呼び出すとカテゴリーの
グループを返します。グループの slug を family に指定して再度呼び出すと、
そのグループの内容を読み込めます。
| 引数 | 型 | 必須 | 機能 |
|---|---|---|---|
family | 文字列、1~80文字 | いいえ | 下位カテゴリーを読み込むためのグループの slug です。 |
limit | 整数、1~200、デフォルトは 20 | いいえ | 返す項目数です。 |
戻り値: slug、family または category に渡せる値、サイト上の名称である
title、url、ページに説明がない場合は null となる description、
および下位カテゴリーの sample_children を含む項目が返されます。
search_recipes
料理名または食材からレシピを検索します。
| 引数 | 型 | 必須 | 機能 |
|---|---|---|---|
query | 文字列、1~120文字 | はい | フランス語で料理名または食材を指定します。 |
limit | 整数、1~100、デフォルトは 20 | いいえ | 返す項目数です。 |
戻り値: id、title、url、image_url、rating、rating_count、
review_count を含む項目の results が返されます。ページに表示されないカウンターは
null になります。ラッパーにはサイトの応答方法が示されます。カテゴリーのページから
応答が返された場合、kind は category となり、total_available はカテゴリー全体の
件数を表します。サイト独自の形式で1ページだけの応答が返された場合、kind は
free_text となり、合計は返された項目数を表します。この2種類の合計は、それぞれ
異なる内容を数えています。サイトが手作業で作成した特集の場合は、kind は guide
となり、項目には名前と URL が含まれますが、合計はありません。そのほか、
result_count、rows_seen、page、single_page、url も返されます。
single_page が付いた一覧で、合計が rows_seen を上回る場合、サイトが件数には
含めているものの返していない項目が残っています。
browse_recipes
カテゴリをページごとに読み込むか、サイトの固定リストのいずれかを読み込みます。
| 引数 | 型 | 必須 | 説明 |
|---|---|---|---|
category | 文字列、1~120文字 | いいえ | list_categories が公開するカテゴリのスラッグです。 |
listing | latest、top_rated、または most_viewed | いいえ | カテゴリの代わりに読み込む固定リストです。 |
page | 整数、1~1000 | いいえ | 読み込むカテゴリのページです。固定リストは1ページのみです。 |
limit | 整数、1~100、デフォルトは 20 | いいえ | 返す行数です。 |
戻り値: search_recipes が返すエンベロープで、kind は
category、standing、または topic です。page はサイトが返したページで、
要求されたページが最終ページを超えると、最初のページに戻ります。
search_by_ingredients
料理する人がすでに持っている材料で何が作れるかを返します。
| 引数 | 型 | 必須 | 説明 |
|---|---|---|---|
ingredients | 1~5個の文字列の配列、各1~60文字 | はい | 手元にある材料をフランス語で指定します。 |
limit | 整数、1~100、デフォルトは 20 | いいえ | 返す行数です。 |
戻り値: 他のリストと同じエンベロープで、kind は fridge です。サイト独自の語彙で照合するため、表記が異なる材料を指定すると、結果が広がるのではなく絞り込まれます。
get_recipe
レシピ全体を読み込み、分量が指定されている場合は材料の量を調整します。
| 引数 | 型 | 必須 | 説明 |
|---|---|---|---|
id | 文字列、1~300文字 | はい | 検索結果またはリストの行の id です。 |
servings | 整数、1~500 | いいえ | この分量に合わせて材料の量を調整します。 |
戻り値: title、url、description、image_url、category、
cuisine、サイトの用語による difficulty、author、published、
modified、rating、rating_count、review_count、prep_minutes、
cook_minutes、total_minutes、記載された分量に対する nutrition、
estimated_cost、keywords、faq、translations が含まれます。ページに記載がない項目は、それぞれ null になります。steps には各工程が1行ずつ記載され、illustrated_steps にはサイトが各工程について撮影した写真とともに同じ工程が記載されます。yield には、レシピが想定する分量と、調整後の分量が示されます。各材料には scaling があり、値は scaled、rounded、unscaled のいずれかです。量を引用する前に確認してください。rounded は、料理で使いやすいように調整されています。
scale_ingredients
サイトに問い合わせることなく、フランス語の任意の材料リストに同じ計算を適用します。
| 引数 | 型 | 必須 | 内容 |
|---|---|---|---|
ingredients | 1~100 個の文字列の配列、各文字列は最大300文字 | はい | 調整するフランス語の材料行です。 |
factor | 0より大きく100以下の数値 | いずれか一方 | 適用する倍率です。 |
from_servings | 0より大きく500以下の数値 | いずれか一方 | 元のリストの分量に相当する人数です。 |
to_servings | 0より大きく500以下の数値 | いずれか一方 | 希望する分量に相当する人数です。 |
factor、またはfrom_servingsとto_servingsの組み合わせを渡してください。
返される内容: 適用されたfactor、get_recipeが返す形式に調整されたingredients、およびscaled_count、rounded_count、unscaled_countです。
get_recipe_translations
サイト自身が公開する対応付けに基づいて、レシピが公開されている他の言語を一覧表示します。
| 引数 | 型 | 必須 | 内容 |
|---|---|---|---|
id | 1~300文字の文字列 | はい | 検索結果または一覧の行のidです。 |
返される内容: translations。各項目には、サイトが公開するlanguageラベルと、その版のurlが含まれます。また、translation_countと、情報の取得元となったフランス語ページのurlも返されます。
分量の調整
分量は適切な単位で表されます。そのため、調整後の行では、レシピの単位とは異なる単位が使われる場合があります。たとえば、200 gを20倍すると4 kgになります。
材料をどの程度細かく分けられるかは、その性質によって異なります。バゲットは半分、3等分、4等分にできますが、卵は分けられません。そのため、どちらにも当てはまらない分量は丸められ、調整後のレシピは元の比率から少しずれます。その行にはroundedが付き、noteに処理内容が記載されます。
数値はこのサーバーで計算したものなので、表示する際は再計算された数値であると伝えてください。ページに人数の記載がないレシピは、人数に合わせて調整できません。その場合は、その旨が応答に示されます。
設定
各変数はすべて任意です。クライアントの設定にある env ブロックで設定します。
| 変数 | デフォルト | 説明 |
|---|---|---|
PTC_USER_AGENT | プロジェクトの識別情報 | サイトに対してアプリケーションを識別し、担当者に連絡できるメールアドレスを伝えます。 |
PTC_MIN_INTERVAL_MS | 1500 | リクエスト間の間隔です。1000~60000 の範囲で指定します。 |
PTC_TIMEOUT_MS | 20000 | リクエストのタイムアウトです。1000~120000 の範囲で指定します。 |
PTC_MAX_RETRIES | 3 | 一時的な失敗後の再試行回数です。0~8 の範囲で指定します。 |
PTC_CACHE_TTL_MS | 900000 | ページをメモリに保持する時間です。0~86400000 の範囲で指定します。 |
PTC_CACHE_MAX_ENTRIES | 200 | 同時にメモリに保持するページ数です。1~5000 の範囲で指定します。 |
PTC_MAX_BODY_BYTES | 8000000 | 全体を読み込むレスポンスの最大サイズです。100000~64000000 の範囲で指定します。 |
PTC_BUDGET_MS | 60000 | 再試行と待機を含め、読み取りがレスポンスを返すまでの時間です。5000~600000 の範囲で指定します。 |
PTC_LOG_LEVEL | error | silent、error、info、debug のいずれかを指定します。エラー出力に書き込みます。 |
範囲外の値はデフォルトに戻され、その理由がエラー出力に書き込まれます。
エラー
各エラーには、6 つのコードのいずれかとメッセージが含まれます。また、必要に応じて次に行う操作も示されます。
| コード | 発生したこと | 対処方法 |
|---|---|---|
not_found | サイトから応答がありましたが、そのレシピまたはページはありません。 | list_categories でスラッグを確認するか、検索で識別子を確認してください。 |
invalid_input | リクエストを送信する前に引数が拒否されました。 | 引数を示すメッセージを読んでください。 |
rate_limited | サイトがこのクライアントにリクエストを減らすよう求めています。 | 指定された秒数だけ待って、同じ引数で再度呼び出してください。レシピは引き続き利用できます。 |
parse_failure | ページは読み込まれましたが、必要なコンテンツがありません。 | インシデント追跡で報告してください。 |
network_error | リクエストが完了しませんでした。 | 少し待ってから再試行してください。 |
timeout | リクエストがタイムアウトまたは予算を超過しました。 | PTC_TIMEOUT_MS または PTC_BUDGET_MS を増やすか、取得する行数を減らしてください。 |
ライブラリとして
サイトを読み込む層は、プロトコルに依存せず、リクエスト間隔、キャッシュ、エラー処理を備えた単独のライブラリとして公開されています。
import { PtitchefClient } from "mcp-ptitchef/client";
const client = new PtitchefClient();
const { data, cached } = await client.listCategories();
console.log(data.results.length, cached);
listCategories、searchRecipes、browseRecipes、searchByIngredients、getRecipe は、それぞれ { data, cached } を返し、6 つのコードのいずれかを持つエラーをスローします。リクエスト間の最小間隔もここで適用されます。
リクエストの間隔と帰属
リクエストは1件ずつ送信され、間隔は少なくとも1.5秒です。設定にかかわらず、間隔が1秒未満になることはありません。User-Agent
の末尾には、常にプロジェクトの識別情報と担当者への連絡先が記載されます。
各検索結果には、読み取ったページのアドレスが含まれ、source には
サイト名が記載されます。レシピ、タイトル、カテゴリーの権利は、Ptitchefと執筆した料理家に帰属します。
このMCPは非公式プロジェクトであり、Ptitchefとは提携していません。
プライバシー
このサーバーは、お客様に関する情報を収集せず、開発者にも何も送信しません。お客様のマシン上で動作し、www.ptitchef.com のみに接続します。動作中はレスポンスをメモリに保持し、ディスクには何も書き込みません。PRIVACY.mdでは、リクエストに含まれる情報と、それに影響する設定について説明しています。
開発
npm install
npm run build:fixtures
npm test
npm run check
テストは生成されたフィクスチャを使用して実行され、リクエストは送信されません。
ライブテストの npm run test:live は、各ルートに1件ずつリクエストを送信し、
毎晩サイト自体に対して実行されます。
貢献
不具合、質問、アイデアは 課題トラッカーにお寄せください。変更の提案も歓迎します。まずチケットを作成すると、変更内容について合意を形成しやすくなります。CONTRIBUTING.mdをご覧ください。
ライセンス
MITです。LICENSEをご覧ください。レシピの権利はPtitchefと各著者に帰属します。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。