mcp-ptitchef
mcp-ptitchef
一个在 Ptitchef 上读取食谱的 MCP 服务器。只读,无需 API 密钥,无需账户。
存在的原因
Ptitchef 通过食材家族的树状结构浏览其食谱,并且它随意地书写每个类别的地址。同类事物在一行中显示为 chou-kale,在下一行显示为 recette-de-petits-pois,在第三行显示为 recettes-aux-feves。没有规则可以从食材名称推导出其中一个。
因此,手工构建的地址会落空,而网站对落空的回应是将读者发送到树的根节点,并返回 HTTP 200 和根节点自身的类别。一个猜测了 slug 的模型会得到一个关于它从未请求过的层级的完整而自信的答案。
这个服务器发布这棵树,因此类别通过网站赋予的名称来打开。
Related MCP server: France BOAMP MCP
工具
list_categories
列出食谱浏览所依据的类别。不带参数调用时,它返回食材家族;将某个家族的 slug 传回,以列出其所包含的内容。
Argument | Type | Meaning |
| string, 可选 | 要打开的家族的 slug,来自之前的调用。省略它以读取根节点。 |
| integer, 可选 | 要渲染的条目数,默认 50,最多 200。 |
{
"family": null,
"family_title": "Recettes de cuisine sur Ptitchef",
"categories": [
{
"slug": "legume",
"title": "Légume",
"url": "https://www.ptitchef.com/recettes/cat/legume",
"description": null,
"sample_children": [
{
"slug": "pois-mange-tout",
"title": "Pois mange-tout",
"url": "https://www.ptitchef.com/recettes/pois-mange-tout"
}
],
"is_family": true
}
],
"category_count": 15,
"categories_published": 15,
"url": "https://www.ptitchef.com/recettes",
"source": "Ptitchef",
"notes": ["…"]
}search_recipes
按菜肴或食材搜索。网站以两种方式之一作答,kind 说明是哪一种。
Argument | Type | Meaning |
| string | 一道菜肴或一种食材,用法语。 |
| integer, 可选 | 要渲染的行数,默认 20,最多 100。 |
搜索 puree de patate douce 会返回 kind: "topic",并带有 topic_slug: "puree-de-patates-douces":网站为它保存了一个页面,将搜索发送到那里,总数统计该页面所包含的内容。搜索 soupe froide concombre menthe 会返回 kind: "free_text":网站没有这样的页面,按自己的方式作答,总数是它提供的行数。
browse_recipes
逐页读取一个类别,或网站长期保留的三个列表之一。
Argument | Type | Meaning |
| string, 可选 | 来自 |
|
| 网站长期保留的列表之一。 |
| integer, 可选 | 要读取的类别的页码。 |
| integer, 可选 | 要渲染的行数,默认 20。 |
search_by_ingredients
读取网站自带的冰箱搜索:输入一到五种食材,输出包含它们的食谱。
Argument | Type | Meaning |
| string[] | 一到五种食材,用法语。 |
| integer, 可选 | 要渲染的行数,默认 20。 |
get_recipe
读取一份食谱,并按请求重新缩放其食材用量。
Argument | Type | Meaning |
| string | 来自搜索或列表的某一行的 |
| integer, 可选 | 将食材用量重新缩放为这么多份。 |
每一行都带有 scaling,说明运算做了什么:scaled 是精确的,rounded 被调整以保持可用,unscaled 不携带任何可被乘的内容。将 1 oeuf 加倍得到 2 oeufs;将其减半得到标记为 rounded 的 1 oeuf,因为半个鸡蛋不是厨房量取的数量。
scale_ingredients
同样的运算,离线进行,适用于任何来源的任何法语食材列表。
Argument | Type | Meaning |
| string[] | 要重新缩放的行。 |
| number | 要应用的乘数。 |
| numbers | 或者从中读取因子的那一对数值。 |
get_recipe_translations
列出食谱发布所用的其他语言。Ptitchef 是一个发布相同食谱的网站网络的法语版,每个页面都会指明其对应版本。有多少种是食谱自己的事:较新的食谱会列出二十多种,较旧的则一种也没有,答案说明页面所携带的内容,而不是这里固定的数字。
答案拒绝夸大之处
网站替换的层级不是所请求的层级。 未知家族会以 HTTP 200 和树的根节点作答,因此答案返回的地址决定了它是哪个层级。未持有的家族被报告为 not_found,而不是渲染为网站改而提供的类别。
家族旁边的条目是摘录。 根节点显示三个条目,后面跟着网站自己打印的省略号。它们在 sample_children 下返回,并附注说明它们是什么,因为将它们渲染为家族内容会把一个有九十个条目的家族呈现成只有三个。
两个计数,因为它们回答两个问题。 categories_published 是页面列出的内容,category_count 是答案渲染的内容。每当 limit 截断列表时它们就会不同,附注说明相差多少,而不是让一个被截断的列表读起来像完整的。
没有地址的条目被搁置而不是渲染。 网站发布的无链接标题不携带可传回的 slug,因此它被丢弃、计数,并在附注中说明。
页面未携带的简介是 null,绝不是空字符串。 空的描述会提供从未发布过的措辞。
一个列表有两个总计,统计不同的东西,答案说明到达的是哪一个。 网站发送到类别页面的搜索报告该类别的总计;网站自己作答的搜索报告它提供的行数。将两者相加会把目录加到页面上。
评分是网站计算出的数字。 一行在其数据中写明 3.8,并绘制四颗星。绘制的数字保持不变。
超过最后一页的页面会以网站提供的页面返回。 网站以第一页作答,因此报告所请求的页码会让调用者永远在同样的行中打转。
冰箱搜索的计数远超其提供的内容。 它为三种食材找到八十九份食谱,在一页上提供其中二十四份,并且没有链接其他页。答案说明这两个数字,并说其余部分无法读取。
指南不是列表,答案说明到达的是哪一个。 有些主题以网站编写的指南形式提供:食谱分组在网站自己的标题下,没有总计,行只携带名称和地址。kind 在那里显示 guide,对同一 slug 调用 browse_recipes 会读取该主题的完整列表及其总计:épinards 以 32 条的指南返回,而其列表包含 736 条。
用另一份食谱代替所请求的食谱时,渲染为缺失。 食谱地址中的词语是装饰性的,而其中的数字不是:请求网站不持有的数字会带回一份无关的食谱,以 HTTP 200 和完整细节返回。返回的数字与请求的数字进行比较。
没有什么是盲目相乘的。 可计数的事物落在厨师从其中取出的最小份额上:当半个无法量取时取整个,比如鸡蛋;当半个可以倒出或分开时取半个,比如小袋。质量在取整前先转换到更小的单位,因此小于一的数量永远不会取整为零。一小撮保留自己的词汇,其数量被相乘,因为一个的大小由厨师决定。
未重新缩放就交回的列表只说明一次,而不是逐行说明。 没有请求份数就没有运算,将每一行标记为 unscaled 会声称它们中没有任何可乘的内容。
网站估算的成本被重复,而不是重新计算。 这是网站自己的数字,网站的读者质疑它过低;答案说明这一点,而不是悄悄传递或默默丢弃。
安装
npx mcp-ptitchefClaude Code
claude mcp add ptitchef -- npx -y mcp-ptitchef任何 MCP 客户端
{
"mcpServers": {
"ptitchef": {
"command": "npx",
"args": ["-y", "mcp-ptitchef"]
}
}
}容器
docker build -t mcp-ptitchef .
docker run -i --rm mcp-ptitchef容器需要能够访问 www.ptitchef.com,仅此而已。它不需要任何凭据,因为本来就没有可取的凭据。
设置
每个设置都是一个环境变量,并且都不是必需的。超出范围的值会被拒绝,并在 stderr 上输出一行,默认值保持不变:无法生效的设置会说明这一点,而不是被悄悄截断。
Variable | Default | Range |
| — | 你自己的标识符。本项目的标识符会保持附加,以便网站可以联系到真人。 |
| 1500 | 1000 到 60000 |
| 20000 | 1000 到 120000 |
| 3 | 0 到 8 |
| 900000 | 0 到 86400000,0 关闭存储 |
| 200 | 1 到 5000 |
| 8000000 | 100000 到 64000000。超过此值,页面会被放弃而不是整体保留 |
| 60000 | 5000 到 600000。包括一次读取的全部、其重试及等待 |
|
|
|
节奏下限无法从外部降低。该网站可免费阅读,且未发布爬取延迟,这更应谨慎行事,而不是快速访问的许可。
作为库使用
读取层单独发布,带有其节奏、存储和错误词汇,不附带任何协议:
import { PtitchefClient } from "mcp-ptitchef/client";错误
六个代码,仅此而已。调用者根据打开消息的代码进行分支。
代码 | 含义 |
| 网站在该地址下没有任何内容 |
| 参数无法生成请求 |
| 网站要求此客户端放慢速度。它没有说明是否有匹配项 |
| 答案以本服务器无法读取的形式到达 |
| 请求无法完成 |
| 截止时间内没有收到答案 |
署名
食谱、标题和类别属于 Ptitchef。每个回答都带有来源,展示给读者的列表应注明网站并链接到页面。
贡献
参见 CONTRIBUTING.md。测试优先,覆盖率下限为 100%,所有内容遵循的规则是:服务器绝不说数据未携带的任何内容。
根据 MIT 许可。
mcp-ptitchef(法语)
一个读取 Ptitchef 食谱的 MCP 服务器。只读,无需 API 密钥,无需账户。
为什么存在
Ptitchef 通过一棵食材家族树来浏览其食谱,并自由书写每个类别的地址。同一种东西在一行叫 chou-kale,下一行叫 recette-de-petits-pois,第三行叫 recettes-aux-feves。没有任何规则可以从食材名称推导出其中一个。
因此,手工构造的地址会落空,网站也会答非所问:将读者重定向到树的根部,返回 HTTP 200,并带有根部的类别。一个猜了 slug 的模型会收到一个完整而确定的、关于它从未请求过的层级的响应。
这个服务器发布这棵树,以便一个类别可以通过网站赋予它的名称打开。
工具
list_categories
列出食谱可以按之浏览的类别。不带参数调用时,它返回食材家族;将某个家族的 slug 传回给它时,它返回该家族包含的内容。
参数 | 类型 | 含义 |
| 字符串,可选 | 要打开的家族的 slug,来自之前的调用。若缺省,则从树的根部读取。 |
| 整数,可选 | 返回的条目数,默认 20,最多 200。 |
search_recipes
按菜肴或食材搜索。网站以五种方式回应,kind 说明是哪一种:当它把搜索发送到自己的某个类别页面时是 topic,当它按自己的条件回应时是 free_text,当它为这个主题撰写了一篇指南时是 guide,当它认为词语足够精确以打开一张卡片时是 recipe,当它因未能理解而提供其首页时是 unmatched。
参数 | 类型 | 含义 |
| 字符串 | 一个菜肴或食材,用法语。 |
| 整数,可选 | 返回的行数,默认 20,最多 100。 |
browse_recipes
逐页浏览一个类别,或浏览网站维护的三个列表之一。
参数 | 类型 | 含义 |
| 字符串,可选 | 来自 |
|
| 网站常设列表之一。 |
| 整数,可选 | 要读取的某个类别的页面。 |
| 整数,可选 | 返回的行数,默认 20。 |
search_by_ingredients
读取网站的“冰箱搜索”:输入一到五种食材,输出包含这些食材的食谱。
参数 | 类型 | 含义 |
| 字符串[] | 一到五种食材,用法语。 |
| 整数,可选 | 返回的行数,默认 20。 |
get_recipe
读取一份食谱,并可按要求重新调整其食材的用量。
参数 | 类型 | 含义 |
| 字符串 | 由搜索或列表返回的某一行的 |
| 整数,可选 | 将食材重新调整为这个份数。 |
每一行都带有一个 scaling,说明算术做了什么:scaled 是精确的,rounded 被移动过以保持可用,unscaled 没有任何可乘的内容。将 1 oeuf 加倍得到 2 oeufs;将其除以二得到标记为 rounded 的 1 oeuf,因为半个鸡蛋不是厨房可以计量的数量。
scale_ingredients
同样的算术,离线进行,适用于任何法语列表,无论其来源如何。
参数 | 类型 | 含义 |
| 字符串[] | 要重新调整的行。 |
| 数字 | 要应用的乘数。 |
| 数字 | 或者可以推导出乘数的那一对。 |
get_recipe_translations
列出一份食谱已发布的其他语言。Ptitchef 是一个发布相同食谱的网站网络的法语版,每个页面都会点名其对应版本。有多少个取决于食谱本身:新近的食谱会列出二十多个,旧的则一个也没有。
回答拒绝断言的内容
指南不是列表,回答会说明返回的是哪一种。 某些主题由网站撰写的指南提供,没有总数,其行带有名称、地址、图片和投票数。此时 kind 为 guide,而对同一 slug 调用 browse_recipes 会返回该主题的完整列表及其总数:épinards 返回一份包含 32 个食谱的指南,而其列表包含 736 个。
一份代替另一份被提供的食谱会被呈现为缺失。 食谱地址中的词语是装饰性的,而其中的编号则不是:请求一个网站不持有的编号会返回一份毫不相关的食谱,HTTP 200,且带有完整详情。返回的编号会与请求的编号进行比较。
列表无法读取的页面不是缺失。 一个带有计数但没有可读列表的标题,是这个服务器无法读取的页面,而它返回的正是这一点,而不是“没有食谱,网站说它有 3200 个”。
评分是网站计算出的数字。 一行在其数据中声明 3.8,却画出四颗星;发布的是计算出的数字,而一个不计算任何评分的指南也不会发布任何评分。
总数统计的是什么,要从回答中读取。 网站发送到某个类别页面的搜索返回该类别的总数;网站自行处理的搜索返回它统计的数量,有时会超过所返回的行数。只有在两个数字都能证明时,说明才会这样说。
没有任何东西会被盲目地乘以。 可数物会落到厨师从单个物品中取用的最小份量:在半个无法计量的地方取整数,如一个鸡蛋;在可以倒出或切开的地方取一半,如一小袋。质量在取整前会先降一个单位,因此低于单位的量永远不会降到零。一小撮保留自己的词汇,其数量会被乘以,因为一撮的大小由厨师决定。
未进行缩放而返回的列表会一次性说明这一点,而不是逐行说明。没有 servings 就没有算术,而将每一行标记为 unscaled 会断言其中没有任何一行带有可乘的内容。
估算成本会被重复,而绝不会重新计算。 这是网站的数字,按页面所声明的份数发布,回答会说明是哪一个。
从页面中读取的地址不会离开该网站。 指向别处的行会被剔除,而不是以“食谱的公开页面”这一标签发布。
安装
npx mcp-ptitchefClaude Code
claude mcp add ptitchef -- npx -y mcp-ptitchef任何 MCP 客户端
{
"mcpServers": {
"ptitchef": {
"command": "npx",
"args": ["-y", "mcp-ptitchef"]
}
}
}容器
docker build -t mcp-ptitchef .
docker run -i --rm mcp-ptitchef容器必须能够访问 www.ptitchef.com,仅此而已。它不接受任何标识符,因为本来就没有任何标识符可接受。
设置
每个设置都是一个环境变量,且都不是必需的。超出范围的值会被拒绝,并在 stderr 上输出一行,默认值继续生效:一个无法应用的设置会说明这一点,而不是被悄悄拉回范围内。
变量 | 默认值 | 范围 |
| — | 您的标识符。项目的标识符仍会附加在后面,以便网站能够联系到一个人。 |
| 1500 | 1000 到 60000 |
| 20000 | 1000 到 120000 |
| 3 | 0 到 8 |
| 900000 | 0 到 86400000,0 关闭存储 |
| 200 | 1 到 5000 |
|
|
|
节奏下限不能从外部降低。该网站可自由阅读,且未公布任何抓取延迟,这正是一个保持谨慎的理由。
作为库使用
读取层单独发布,带有自己的节奏、存储和错误词汇,不附带任何协议:
import { PtitchefClient } from "mcp-ptitchef/client";错误
六个代码,一个也不多。调用方根据打开消息的代码进行分支。
代码 | 含义 |
| 该网站在此地址没有任何内容 |
| 这些参数无法构成有效的请求 |
| 该网站要求此客户端放慢速度。这并不说明它提供什么内容 |
| 响应以该服务器无法读取的形式到达 |
| 请求未能完成 |
| 在时限内没有收到任何响应 |
署名
食谱、标题和分类均归 Ptitchef 所有。每条响应都带有来源,展示给读者的列表必须注明网站出处并链接到相应页面。
贡献
参见 CONTRIBUTING.md。测试优先,覆盖率下限为 100%,并且所有内容遵循的规则是:服务器绝不说出数据本身不承载的内容。
以 MIT 许可证发布。
Maintenance
Related MCP Servers
- FlicenseCqualityDmaintenanceEnables management of culinary recipes through web scraping from sites like Marmiton.org, recipe generation, ingredient management, and querying a MongoDB database of recipes, comments, users, and utensils.18
- AlicenseNot gradedqualityCmaintenanceEnables querying French government public procurement notices (BOAMP) without an API key.13MIT
- AlicenseAqualityBmaintenanceMCP server that searches French recipes from Marmiton, reads ingredients and steps, and rescales quantities to any number of servings without requiring an API key.632,395MIT
- AlicenseNot gradedqualityAmaintenanceMCP server enabling search and retrieval of public SensCritique data, including works, user profiles, and collections.219MIT
Related MCP Connectors
Recipes MCP — wraps TheMealDB API (free tier, no auth)
Unofficial read-only MCP server for VeryChic hotel offers
Spoonacular food API: recipes, nutrition, ingredients, meal plans. Free 150/day.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/smeet666/mcp-ptitchef'
If you have feedback or need assistance with the MCP directory API, please join our Discord server