关于 mcp-supertoinette
mcp-supertoinette 将聊天客户端连接到 Supertoinette 法语食谱站点,可搜索食谱、调整份量并查询站点的葡萄酒搭配建议,无需 API 密钥或账户。
主要功能
- 01按菜名或食材搜索食谱
- 02读取食谱并调整份量
- 03分页浏览食谱分类
- 04查询葡萄酒搭配
- 05缩放任意食材清单
适用场景
- 01按食材寻找法语食谱
- 02调整多人用餐的食谱份量
- 03浏览某个分类中的食谱
- 04查看菜品对应的站点酒类建议
MCP 相关
向 MCP 客户端提供 Supertoinette 食谱搜索、详情读取、分类浏览、葡萄酒搭配和食材缩放工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
6收录的工具列表 · 更新于 今天
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | string | 是 | 食谱地址中的数字,例如 '4210'。没有食谱编号时,请搜索菜品。 |
| servings | integer | 否 | 将用量调整为此份数。省略时,按网站发布的原始用量返回。如果网站的原文中没有可用于换算的数字,则会拒绝此参数。 |
详细介绍
mcp-supertoinette
Supertoinette 是一个法国烹饪网站,也是现存最古老的网站之一。它的食谱会列出食材、步骤、准备时间、烹饪时间和静置时间、适用人数,以及菜品照片。除了食谱,网站还设有专门页面,介绍适合搭配菜品的饮品、与菜品相配的葡萄酒,以及葡萄酒所属的风格。
此服务可将聊天客户端连接到该网站。你可以搜索食谱、阅读按餐桌人数调整过食材用量的食谱、浏览分类、逐页阅读分类页面,还可以查询网站建议搭配菜品的饮品。它无需 API 密钥或账户。
安装
一键安装
Claude Code
claude mcp add supertoinette -- npx -y mcp-supertoinette
Claude Desktop、Cursor 及任何使用标准配置格式的客户端
{
"mcpServers": {
"supertoinette": {
"command": "npx",
"args": ["-y", "mcp-supertoinette"]
}
}
}
需要 Node 24 或更高版本,无需设置任何环境变量。
使用 Docker
{
"mcpServers": {
"supertoinette": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-supertoinette:1.1.0"]
}
}
}
-i 会保持 stdin 打开,协议通过它传输;省略 -t,因为 TTY 会改写数据流。容器需要能够通过 HTTPS 向 www.supertoinette.com 发起出站连接,仅此而已:无需卷、端口或凭据。
打包,无需 npm
从最新版本下载
mcp-supertoinette-1.1.0.mcpb 并打开。支持 MCP bundle 的客户端会自动安装,无需 npm,也无需编辑配置文件。bundle 包含所有依赖,因此安装时不会下载任何内容。
可以询问的内容
- « 给我找一道小牛肉白酱炖菜的食谱。 »
- "把那道食谱读给我听,按十人份来。"
- "这个网站按哪些类别归档食谱?"
- "牛肉勃艮第炖菜配什么葡萄酒?"
- "把我祖母笔记本里的这份食材清单扩大三倍。"
Supertoinette 是一个法国网站,因此食谱都是法语。通常的操作路径是先搜索,再查看食谱:每一行都带有一个 id,而 get_recipe 需要这个 id。
工具
| 工具 | 功能 |
|---|---|
get_recipe | 读取一道食谱,并可按要求调整份数。 |
search_recipes | 按菜名或食材查找食谱。 |
list_categories | 读取网站用于归档食谱的类别。 |
browse_recipes | 逐页读取一个类别中的食谱。 |
get_wine_pairings | 读取网站建议与某道菜搭配饮用的酒。 |
scale_ingredients | 调整任意食材清单的用量,不会向网站发出请求。 |
get_recipe
完整读取一道食谱;如果提供份数,则会相应调整食材用量。
| 参数 | 类型 | 必填 | 功能 |
|---|---|---|---|
id | string,1 到 10 个字符 | 是 | 食谱地址中的编号,每一行都会附带此编号。 |
servings | integer,1 到 1000 | 否 | 将食材用量调整为指定份数。 |
返回内容: title,其中会去掉网站标题开头的图标;title_as_published,保留网站原样标题;url;description;published_at;intro,即烹饪步骤上方的介绍文字;steps;prep_minutes、cook_minutes、rest_minutes 和 total_minutes;category;author;以及 rating,页面未注明的字段均为 null。yield 表示食谱原本的份数以及调整后的份数。ingredients 包含各行食材及页面为其分组设置的标题;ingredient_count 统计的就是这些行数。每行的 scaling 值为 scaled、rounded 或 unscaled。
search_recipes
逐页按菜名或食材搜索食谱。
| 参数 | 类型 | 必填 | 功能 |
|---|---|---|---|
query | string,1 到 120 个字符 | 是 | 法语的菜名或食材。 |
limit | integer,1 到 39 | 否 | 返回的行数。 |
page | integer,1 到 1000 | 否 | 要读取的结果页码;默认读取第一页。 |
category | string,1 到 60 个字符 | 否 | 一个类别,拼写须与先前回答中 facets 给出的拼写一致。 |
返回内容: 各行包含 id(get_recipe 需要此字段)、title、title_as_published 和 url。此外还会返回 page、last_page(网站从当前页链接到的最高页码)、result_count、rows_published(页面在呈现任何行之前所包含的行数)、total_available 和 facets(其中列出了后续搜索可用的类别名称)。切勿自行拼写类别名称:如果网站不认识该名称,就会返回一页空结果。
list_categories
读取网站用于归档食谱的类别。此工具无需参数。
返回内容: categories,其中包含网站两个列表中的条目;category_count 为条目数;以及读取这些类别的 url。将类别传递给 browse_recipes。
browse_recipes
逐页读取一个类别。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
category | string,1 到 80 个字符 | 是 | 类别,取自 list_categories 发布的内容。 |
limit | integer,1 到 30 | 否 | 返回的行数。 |
page | integer,1 到 1000 | 否 | 要读取的页码,默认为第一页。 |
返回内容: 行数据以及 search_recipes 返回的封装信息,其中
last_page 表示列表到第几页结束。
get_wine_pairings
读取网站根据其撰写的相关页面,为一道菜建议搭配饮用的内容。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | string,1 到 10 个字符 | 二选一 | 菜品网址中的编号。 |
page | integer,1 到 100 | 二选一 | 网站自有菜品列表中的页码。 |
返回内容: 各条目包含 id、网站为该菜品使用的名称 dish,以及页面开头提到的葡萄酒风格 style;如果页面未提及,则为 null。
scale_ingredients
对任意法语食材列表执行相同的算术换算,无需向网站发出请求。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
ingredients | 由 1 到 200 个字符串组成的数组,每个字符串为 1 到 300 个字符 | 是 | 要换算的行,按照食谱中的写法提供。 |
factor | number,大于 0 且不超过 100 | 二选一 | 食材数量要乘以的倍数。 |
from_servings | integer,1 到 1000 | 二选一 | 列表原本对应的份数。 |
to_servings | integer,1 到 1000 | 二选一 | 应供多少人食用。 |
传入 factor,或同时传入 from_servings 和 to_servings。
返回内容: 按照 get_recipe 的格式返回换算后的行,每行都包含其 scaling。
换算数量
数量会以适合的单位表示,因此返回的行可能采用不同于食谱原文的单位:200 g 乘以 20 后为
4 kg。
食材能切分到多细取决于食材本身。法棍可以切成两份、三份或四份;鸡蛋则不能分着用。若数量落在两者之间,就会进行四舍五入,换算后的食谱比例也会与原食谱略有不同。该行会包含 rounded,并在备注中说明处理方式。
这些数字是此服务的计算结果,因此展示时请说明它们是重新计算得出的。若食谱页面未注明份数,就无法换算成指定人数的用量,返回结果也会说明这一点。
配置
所有变量均为可选项。在客户端配置的 env 块中设置。
| 变量 | 默认值 | 作用 |
|---|---|---|
STO_USER_AGENT | 项目标识 | 向网站标识你的应用,并提供可联系到相关人员的地址。 |
STO_MIN_INTERVAL_MS | 3000 | 两次请求之间的间隔,范围为 3000 到 60000。 |
STO_TIMEOUT_MS | 20000 | 单次请求的截止时间,范围为 1000 到 120000。 |
STO_MAX_RETRIES | 3 | 临时故障后的重试次数,范围为 0 到 8。 |
STO_CACHE_TTL_MS | 900000 | 页面在内存中的保留时长,范围为 0 到 86400000。 |
STO_CACHE_MAX_ENTRIES | 200 | 内存中同时保留的页面数,范围为 1 到 5000。 |
STO_MAX_BODY_BYTES | 8000000 | 读取的页面大小上限(字节),范围为 100000 到 64000000。 |
STO_LOG_LEVEL | error | silent、error、info 或 debug,写入 stderr。 |
超出范围的值会回退为默认值,原因会写入 stderr。
错误
每种故障都会包含六种代码之一、一条消息,以及在有帮助时提供的提示,指出下一步操作。
| 代码 | 发生的情况 | 处理方法 |
|---|---|---|
not_found | 网站已响应,但没有此食谱或页面。 | 使用 search_recipes 检查 ID。 |
invalid_input | 请求发出前,参数已被拒绝。 | 阅读消息,其中会指出相关参数。 |
rate_limited | 网站要求此客户端放慢请求速度。 | 等待提示中指定的秒数,然后使用相同参数再次调用。食谱仍然存在。 |
parse_failure | 页面已加载,但缺少预期内容。 | 在问题跟踪页报告此问题。 |
network_error | 请求未能完成。 | 稍后重试。 |
timeout | 请求超过了截止时间。 | 提高 STO_TIMEOUT_MS,或减少请求的行数。 |
作为库使用
读取网站的这一层单独发布,包含请求间隔控制、缓存和错误处理,且不绑定任何协议。
import { SupertoinetteClient } from "mcp-supertoinette/client";
const client = new SupertoinetteClient();
const { data, cached } = await client.getRecipe({ id: "10" });
console.log(data.title, data.ingredients.length, cached);
searchRecipes、browseRecipes、getRecipe 和 getPairings 均返回
{ data, cached },并会抛出携带六种代码之一的错误。这里同样会确保两次请求之间至少间隔三秒。
请求频率与署名
请求逐个发送,间隔至少三秒;无论服务器如何配置,这一间隔下限始终有效。User-Agent 始终以项目标识和可联系到真人的地址结尾。
每条结果都会附上读取内容的页面地址,source 则标明网站。食谱、标题和照片均属于 Supertoinette。
此 MCP 服务是一个非官方项目,与 Supertoinette 毫无关联。
隐私
此服务不会收集你的任何信息,也不会向作者发送任何内容。它在你的机器上运行,只会联系 www.supertoinette.com,运行期间将回答保存在内存中,不会写入磁盘。
PRIVACY.md 说明请求会携带哪些内容,以及哪些设置会改变这些内容。
开发
npm install
npm run build:fixtures
npm test
npm run check
测试使用生成的测试样例运行,不会发出网络请求。实时测试套件
npm run test:live 会针对每个路由发出一次请求,并每晚直接对该网站运行。
贡献
欢迎在问题跟踪器中反馈错误、提出问题和分享想法。欢迎提交拉取请求;先提出问题有助于商定修改方案。请参阅 CONTRIBUTING.md。
许可证
MIT,详见 LICENSE。食谱属于 Supertoinette 及其作者。
mcp-supertoinette(法语)
Supertoinette 是一个法国烹饪网站,也是至今仍在运营的最古老网站之一。它的食谱列出了食材、步骤、准备时间、烹饪时间和静置时间、可供食用的人数,以及菜品照片。除了食谱,它还维护着一系列介绍菜品搭配饮品的页面,为菜品搭配葡萄酒,并说明葡萄酒的风格。
此服务将对话客户端连接到该网站。你可以搜索食谱、查看食谱及按人数调整后的食材、浏览食谱分类、逐页查看某个分类,还可以查询网站为菜品推荐的饮品。无需 API 密钥,也无需账户。
安装
一键安装
Claude Code
claude mcp add supertoinette -- npx -y mcp-supertoinette
Claude Desktop、Cursor,以及任何采用标准配置格式的客户端
{
"mcpServers": {
"supertoinette": {
"command": "npx",
"args": ["-y", "mcp-supertoinette"]
}
}
}
需要 Node 24 或更高版本,无需设置任何环境变量。
使用 Docker
{
"mcpServers": {
"supertoinette": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-supertoinette:1.1.0"]
}
}
}
-i 会保持标准输入打开,它是协议通道;省略 -t,因为 TTY 会改写数据流。容器需要能通过 HTTPS 访问 www.supertoinette.com,除此之外不需要任何东西:无需卷、端口或凭据。
Bundle,无需 npm
从最新发布版本
下载 mcp-supertoinette-1.1.0.mcpb 并打开。支持 MCP bundle 的客户端会自动安装,无需 npm,也无需修改配置文件。bundle 包含其依赖项,因此安装时不会下载任何内容。
可以询问的内容
- “给我找一道小牛肉白酱炖菜的食谱。”
- “给我读一下这份适合 10 人食用的食谱。”
- “网站将食谱归入哪些类别?”
- “勃艮第炖牛肉配什么酒?”
- “把我祖母食谱本上的这份食材清单乘以 3。”
Supertoinette 是一个法国网站,因此它的食谱都是法语。常见流程是先搜索,再查看食谱:搜索结果行包含一个 id,get_recipe 会使用这个标识符。
工具
| 工具 | 功能 |
|---|---|
get_recipe | 读取一份食谱,并可按需调整份数。 |
search_recipes | 按菜肴或食材查找食谱。 |
list_categories | 读取网站对食谱进行分类的类别。 |
browse_recipes | 逐页读取某个类别。 |
get_wine_pairings | 读取网站推荐与某道菜搭配的饮品。 |
scale_ingredients | 调整任意食材清单,无需向网站发出请求。 |
get_recipe
读取完整食谱;如果提供份数,还会相应调整食材用量。
| 参数 | 类型 | 必需 | 功能 |
|---|---|---|---|
id | 字符串,1 至 10 个字符 | 是 | 食谱网址中的编号,搜索结果行中会提供。 |
servings | 整数,1 至 1000 | 否 | 将食材用量调整为指定份数。 |
返回内容: title 不含网站标题前的图标,title_as_published 则与网站上的写法完全一致;url;description;published_at;intro,即烹饪步骤上方的介绍文字;steps;prep_minutes、cook_minutes、rest_minutes 和 total_minutes;category;author;以及 rating。页面未注明的字段均为 null。yield 说明食谱原本对应的份数,以及调整后的份数。ingredients 包含食材行及页面用于分组的副标题;ingredient_count 统计食材数量;每行的 scaling 值为 scaled、rounded 或 unscaled。
search_recipes
按菜肴或食材搜索食谱,每次读取一页。
| 参数 | 类型 | 必需 | 功能 |
|---|---|---|---|
query | 字符串,1 至 120 个字符 | 是 | 用法语填写菜肴或食材。 |
limit | 整数,1 至 39 | 否 | 返回的行数。 |
page | 整数,1 至 1000 | 否 | 要读取的结果页,默认读取第一页。 |
category | 字符串,1 至 60 个字符 | 否 | 类别,拼写须与先前响应中的 facets 一致。 |
返回内容: 包含 id 的行,get_recipe 可使用该标识符;还包含 title、title_as_published 和 url。此外还有 page、last_page(网站从当前页链接到的最远页面)、result_count、rows_published(页面在渲染前包含的行数)、total_available 和 facets。facets 提供类别名称的原始写法,可供后续搜索使用。切勿自行拼写类别名称:对于网站不认识的类别,它会返回一个看起来像是没有结果的页面。
list_categories
读取网站为其食谱分类的类别。此工具不接受任何参数。
返回: categories,其中包含两份网站列表中收录的条目数 category_count,以及读取类别的来源 url。类别可传给 browse_recipes。
browse_recipes
逐页读取某个类别。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
category | 字符串,1 至 80 个字符 | 是 | 由 list_categories 发布的类别。 |
limit | 整数,1 至 30 | 否 | 要返回的行数。 |
page | 整数,1 至 1000 | 否 | 要读取的页码,默认为第一页。 |
返回: search_recipes 返回的行和封装对象,其中 last_page 表示列表的末页。
get_wine_pairings
根据网站撰写的相关页面,读取网站建议搭配某道菜饮用的酒。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | 字符串,1 至 10 个字符 | 二选一 | 菜品网址中的编号。 |
page | 整数,1 至 100 | 二选一 | 网站菜品列表中的页码。 |
返回: 包含 id、网站所用名称 dish,以及页面开头所列葡萄酒风格 style 的条目;如果页面未写明风格,则为 null。
scale_ingredients
对任意法语食材列表应用相同的计算,无需查询网站。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
ingredients | 数组,含 1 至 200 个字符串,每个 1 至 300 个字符 | 是 | 要调整的行,按照食谱中的写法填写。 |
factor | 数字,大于 0 且不超过 100 | 二选一 | 数量的乘数。 |
from_servings | 整数,1 至 1000 | 二选一 | 原列表对应的用餐人数。 |
to_servings | 整数,1 至 1000 | 二选一 | 目标用餐人数。 |
请传入 factor,或同时传入 from_servings 和 to_servings。
返回: 按 get_recipe 返回的格式调整后的行,每行都包含其 scaling。
数量调整
数量以适合的单位表示。因此,调整后某一行的单位可能与食谱中的不同:200 g 乘以二十后得到 4 kg。
食材可切分的精细程度取决于其性质。法棍可以切成两份、三份或四份;鸡蛋则不能分割。因此,遇到无法整除的数量时会进行四舍五入,调整后的食谱与原比例会有轻微偏差。该行会标记为 rounded,并在说明中注明处理方式。
这些数字是由此服务进行计算的,因此展示时请说明它们经过了重新计算。如果食谱页面没有注明份数,就无法按用餐人数调整,返回结果会说明这一点。
配置
每个变量都是可选的。它们应放在客户端配置的 env 块中。
| 变量 | 默认值 | 作用 |
|---|---|---|
STO_USER_AGENT | 项目标识 | 向网站标识您的应用,并提供联系人员的地址。 |
STO_MIN_INTERVAL_MS | 3000 | 两次请求之间的间隔,范围为 3000 到 60000。 |
STO_TIMEOUT_MS | 20000 | 请求超时时间,范围为 1000 到 120000。 |
STO_MAX_RETRIES | 3 | 临时失败后的重试次数,范围为 0 到 8。 |
STO_CACHE_TTL_MS | 900000 | 页面在内存中保留的时长,范围为 0 到 86400000。 |
STO_CACHE_MAX_ENTRIES | 200 | 同时保留在内存中的页面数,范围为 1 到 5000。 |
STO_MAX_BODY_BYTES | 8000000 | 读取的页面最大大小(字节),范围为 100000 到 64000000。 |
STO_LOG_LEVEL | error | silent、error、info 或 debug,写入错误输出。 |
超出范围的值会恢复为默认值,原因会写入错误输出。
错误
每次失败都会带有六种代码之一和一条消息,并在有帮助时提供下一步操作建议。
| 代码 | 发生的情况 | 处理方法 |
|---|---|---|
not_found | 网站已响应,但没有这道菜谱或这个页面。 | 使用 search_recipes 检查标识符。 |
invalid_input | 参数在发出任何请求前就被拒绝。 | 阅读消息,其中会指出具体参数。 |
rate_limited | 网站要求此客户端降低请求频率。 | 等待指定的秒数,然后使用相同参数再次调用。菜谱仍然存在。 |
parse_failure | 页面已加载,但缺少预期内容。 | 在问题跟踪页报告此问题。 |
network_error | 请求未能完成。 | 稍后重试。 |
timeout | 请求超过了超时时间。 | 增大 STO_TIMEOUT_MS,或减少请求的行数。 |
作为库使用
读取网站的层单独发布,包含请求节奏、缓存和错误处理,不绑定任何协议。
import { SupertoinetteClient } from "mcp-supertoinette/client";
const client = new SupertoinetteClient();
const { data, cached } = await client.getRecipe({ id: "10" });
console.log(data.title, data.ingredients.length, cached);
searchRecipes、browseRecipes、getRecipe 和 getPairings 各自返回
{ data, cached },并会抛出带有六种代码之一的错误。两次请求之间至少间隔
三秒的限制在此处同样适用。
请求节奏与署名
请求会逐个发出,两次请求之间至少间隔三秒,无论配置如何,此下限都适用。User-Agent 始终以项目标识和联系人员的地址结尾。
每个结果都会附带读取该结果的页面地址,source 则标明网站。菜谱、标题和照片的所有权均属于 Supertoinette。
此 MCP 是一个非官方项目,与 Supertoinette 无关联。
隐私
此服务不会收集您的任何信息,也不会向其作者发送任何信息。它在
您的计算机上运行,只连接 www.supertoinette.com,在运行期间将响应保存在内存中,
不会向磁盘写入任何内容。PRIVACY.md 说明了请求会携带哪些信息,以及哪些设置会改变这一点。
开发
npm install
npm run build:fixtures
npm test
npm run check
测试使用生成的 fixtures 运行,不会发出任何请求。
实时测试套件 npm run test:live 会为每个路由发出一个请求,并且每晚都会针对网站本身运行。
贡献
问题报告、疑问和想法都可以提交到 问题跟踪区。欢迎提出修改建议;先提交工单有助于 就修改方案达成一致。请参阅 CONTRIBUTING.md。
许可证
MIT,详见 LICENSE。食谱归 Supertoinette 及其作者所有。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。