关于 mcp-marmiton
mcp-marmiton 将聊天客户端连接到 Marmiton 食谱,适合家庭烹饪和餐食规划。它支持搜索、读取完整食谱,并按用餐人数或自带食材清单调整用量。
主要功能
- 01按菜名或食材搜索食谱
- 02读取食材、步骤和烹饪时间
- 03按用餐人数调整食谱用量
- 04缩放独立的食材清单
- 05无需 API 密钥或账户
适用场景
- 01按现有食材查找食谱
- 02按不同用餐人数调整食谱
- 03缩放书中食谱的食材清单
MCP 相关
MCP 服务向兼容客户端提供食谱搜索、读取和食材用量调整工具。它从 Marmiton 读取内容,不会向网站发布内容。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
3收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| limit | integer | 否 | 此页结果中最多返回的食谱数。 |
| query | string | 是 | 要搜索的内容,使用法语,例如 'tarte aux pommes'。 |
详细介绍
mcp-marmiton
Marmiton 是法国规模最大的烹饪网站,自 1999 年起,家庭厨师便一直在这里发布食谱。每份食谱都列出食材及其用量、烹饪步骤、准备和烹饪时间、适用人数,以及制作过这道菜的人留下的评分。
此服务可将聊天客户端连接到该网站。你可以按菜名或食材搜索食谱,查看包含食材和步骤的完整食谱,还可以按餐桌就餐人数调整用量;每一行都会注明数值是精确的,还是为了便于厨房操作而做了调整。无需 API 密钥,也无需账号。
安装
一键安装
Claude Code
claude mcp add marmiton -- npx -y mcp-marmiton
Claude Desktop、Cursor,以及所有使用标准配置格式的客户端
{
"mcpServers": {
"marmiton": {
"command": "npx",
"args": ["-y", "mcp-marmiton"]
}
}
}
需要 Node 24 或更高版本,无需设置任何环境变量。
使用 Docker
{
"mcpServers": {
"marmiton": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-marmiton:2.1.0"]
}
}
}
-i 会保持 stdin 开启,协议通过它传输;不使用 -t,因为 TTY 会改写数据流。容器需要能够通过 HTTPS 访问 www.marmiton.org,除此之外不需要任何东西:无需挂载卷、无需端口、无需凭据。
打包版本,无需 npm
从最新版本下载
mcp-marmiton-2.1.0.mcpb 并打开。支持 MCP bundle 的客户端会自动安装,无需 npm,也无需编辑配置文件。该 bundle 包含所有依赖项,因此安装时不会下载任何内容。
你可以这样提问
- « 给我找一个苹果挞食谱。 »
- "把这份食谱改成适合六个人,而不是四个人。"
- "我能用西葫芦和山羊奶酪做些什么?"
- "这是我从书上抄下来的食谱,帮我把用量乘以 1.5。"
- "第二道菜需要多长时间烹饪?"
Marmiton 是一个法国网站,因此要用法语搜索食谱:tarte aux pommes、poulet curry coco。通常的流程是先搜索,再查看食谱:search_recipes 会返回一个 id,然后将该 ID 传给 get_recipe。
工具
| 工具 | 功能 |
|---|---|
search_recipes | 按菜名或食材查找食谱。 |
get_recipe | 读取一份食谱,并可按需换算为指定份数。 |
scale_ingredients | 换算任意食材清单,无需向网站发送请求。 |
该服务仅执行读取操作,不会向 Marmiton 发布任何内容。
search_recipes
按菜名或食材搜索食谱。Marmiton 会匹配单词的开头字母,因此查询会返回网站为其排序的结果;如果标题中没有包含查询词,答复也会说明这一点。
| 参数 | 类型 | 必填 | 功能 |
|---|---|---|---|
query | 字符串,最多 200 个字符 | 是 | 要搜索的内容,使用法语。 |
limit | 整数,1 到 30,默认值为 10 | 否 | 从此结果页返回的食谱数量。 |
**返回内容:**包含 id 的结果行,get_recipe 会使用该值;还有 title、url 和 image_url。如果某份食谱发布时没有图片,image_url 的值为 null。此外还会返回 result_count 和 total_available,分别表示应用 limit 之前此页上的食谱数量。Marmiton 的 robots.txt 禁止翻页浏览搜索结果,因此一次搜索只会读取一页;缩小查询范围即可查看其他食谱。
get_recipe
完整读取一份食谱;如果指定了份数,还会换算食材用量。
| 参数 | 类型 | 必填 | 功能 |
|---|---|---|---|
id | 纯数字字符串 | 二选一 | Marmiton 食谱 ID,与 search_recipes 返回的值相同。 |
url | marmiton.org URL | 二选一 | 食谱的网址,在未提供 id 时使用。 |
servings | 大于 0 且最多为 500 的数字 | 否 | 将用量换算为指定份数。 |
返回内容:title、url、ingredients、steps、prep_minutes、cook_minutes、total_minutes、category、author、rating 和 nutrition;如果页面未发布相应信息,则对应值为 null。yield 说明食谱原本适用的份数以及换算后的份数,包含 original_count、original_text、requested、表示计数单位的 unit,以及所用乘数 factor。每种食材都包含 original、text、amount、表示范围上限的 amountMax、unit 和 scaling;scaling 的值为 scaled、rounded 或 unscaled。这些数值由此服务计算,因此展示时请说明它们是重新计算得出的。nutrition 描述的是食谱发布时、按其原始份数计算的营养信息。
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,用于统计数值经缩放后发生变化的行数。
缩放数量
每种食材都会带有一个 scaling 标记,说明其数量经过缩放后的处理方式。
| 标记 | 含义 | 示例 |
|---|---|---|
scaled | 数值是直接相乘的结果。 | 3 oeufs ×2 → 6 oeufs |
rounded | 为了便于使用,对数值进行了调整。 | 25 cl de lait ×0.667 → 17 cl de lait |
unscaled | 不含数量,因此保持原样。 | sel、coriandre |
数量会以合适的单位表示,因此返回的食材行可能使用与原食谱不同的单位:200 g 乘以 20 后显示为 4 kg。
食材可以细分到什么程度,取决于食材本身。法棍可以切成两份、三份或四份;鸡蛋则无法分割。若计算出的数量介于两种可行数量之间,就会进行舍入,此时缩放后的食谱与原比例会略有偏差。该行会标记为 rounded,并在其 note 中说明处理方式。
配置
所有变量均为可选项。在客户端配置的 env 块中设置。
| 变量 | 默认值 | 作用 |
|---|---|---|
MARMITON_USER_AGENT | 项目标识 | 向 Marmiton 标明你的应用,并提供可联系到相关人员的地址。 |
MARMITON_MIN_INTERVAL_MS | 1000 | 两次请求之间的间隔,范围为 500 至 60000。低于下限的值会被拒绝,并使用下限值。 |
MARMITON_TIMEOUT_MS | 15000 | 单次请求的截止时间,范围为 1000 至 120000。 |
MARMITON_MAX_RETRIES | 3 | 瞬时故障后的重试次数,范围为 0 至 10。 |
MARMITON_CACHE_TTL_MS | 900000 | 页面在内存中的保留时长,范围为 0 至 86400000。 |
MARMITON_CACHE_MAX_ENTRIES | 200 | 同时保存在内存中的页面数,范围为 0 至 10000。 |
MARMITON_MAX_BODY_BYTES | 8000000 | 此工具读取的页面大小上限,单位为字节,范围为 100000 至 64000000。 |
MARMITON_LOG_LEVEL | error | 日志级别:silent、error、info 或 debug,输出到 stderr。 |
超出范围的值会回退为默认值,原因会写入 stderr。
错误
每种失败都包含六种代码之一、一条消息,以及在有帮助时指明下一步操作的提示。
| 代码 | 发生了什么 | 如何处理 |
|---|---|---|
not_found | Marmiton 已响应,但没有此菜谱。 | 使用 search_recipes 检查 ID。 |
invalid_input | 请求发出前,参数已被拒绝。 | 阅读消息,其中会指出对应的参数。 |
rate_limited | Marmiton 要求此客户端减慢请求速度。 | 等待提示中指定的秒数,然后使用相同参数再次调用。菜谱仍然存在。 |
parse_failure | 页面已加载,但缺少预期内容。 | 在问题跟踪页报告。 |
network_error | 请求未能完成。 | 稍后重试。 |
timeout | 请求超过了截止时间。 | 调高 MARMITON_TIMEOUT_MS。 |
作为库使用
读取 Marmiton 的这一层单独发布,包含请求间隔控制、缓存和错误处理,且不绑定任何协议。
import { MarmitonClient } from "mcp-marmiton/client";
const client = new MarmitonClient();
const { data, cached } = await client.getRecipe({ id: "18257" });
console.log(data.title, data.ingredients.length, cached);
search 和 getRecipe 均会返回 { data, cached },并会抛出携带六种代码之一的错误。两次请求之间的间隔下限在此同样适用。
请求频率与署名
请求会逐个发送,且彼此之间至少间隔一段时间,无论服务如何配置,这个间隔下限都不会改变。User-Agent 始终以项目标识和可联系到负责人的地址结尾。所有内容均读取自 Marmiton 发布供机器使用的 schema.org JSON-LD 数据,并且不会访问其 robots.txt 禁止访问的路径。
每个结果都包含食谱标题和地址;如果页面注明了作者,get_recipe 也会包含作者信息,以及由署名、标题和地址组成的一行文字。
食谱属于 Marmiton 以及撰写食谱的厨师。这个 MCP 服务是一个非官方项目,与 Marmiton 没有关联。
隐私
此服务不会收集关于你的任何信息,也不会向其作者发送任何内容。它在你的机器上运行,只会联系 www.marmiton.org,运行期间将答复保存在内存中,不会写入磁盘。
PRIVACY.md 说明了请求会携带哪些信息,以及哪些设置会改变这些信息。
开发
npm install
npm run build:fixtures
npm test
npm run check
测试使用生成的测试夹具运行,不会发起网络请求。实时测试套件 npm run test:live 会对每个路由发起一次请求,并每晚针对网站本身运行。
贡献
错误、问题和想法请提交至问题跟踪器。欢迎提交拉取请求;先提出问题有助于就更改方案达成一致。请参阅 CONTRIBUTING.md。
许可证
MIT,详见 LICENSE。食谱属于 Marmiton 及其作者。
mcp-marmiton(法语)
Marmiton 是法国最大烹饪网站,自 1999 年起,厨师们便在此发布食谱。每份食谱都会列出配料及其用量、操作步骤、准备和烹饪时间、适用人数,以及制作过这道菜的人留下的评分。
此服务将对话客户端连接到该网站。你可以按菜品或配料搜索食谱,阅读包含配料和步骤的完整食谱,还可以根据就餐人数调整用量;每一行都会注明数字是精确值,还是为了便于烹饪而进行了调整。无需 API 密钥,也无需账号。
安装
一键安装
Claude Code
claude mcp add marmiton -- npx -y mcp-marmiton
Claude Desktop、Cursor,以及所有采用标准配置格式的客户端
{
"mcpServers": {
"marmiton": {
"command": "npx",
"args": ["-y", "mcp-marmiton"]
}
}
}
需要 Node 24 或更高版本,无需设置任何环境变量。
使用 Docker
{
"mcpServers": {
"marmiton": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-marmiton:2.1.0"]
}
}
}
-i 会保持标准输入打开,它是协议通信通道;省略 -t 是因为 TTY 会重写数据流。容器需要能够通过 HTTPS 向外访问 www.marmiton.org,除此之外不需要任何东西:无需卷、端口或凭据。
Bundle,无需 npm
从最新发布版本下载 mcp-marmiton-2.1.0.mcpb 并打开。支持 MCP bundle 的客户端会自动完成安装,无需 npm,也无需修改配置文件。Bundle 已包含其依赖项,因此安装时不会下载任何内容。
可以询问的内容
- “帮我找一个苹果挞的食谱。”
- “把这个食谱按 6 人份而不是 4 人份读给我听。”
- “西葫芦和山羊奶酪可以做什么?”
- “这是我从书上抄下来的食谱,把用量乘以 1.5。”
- “第二个食谱要烤多久?”
Marmiton 是一个法国网站,因此它的食谱都是法语的:tarte aux pommes、poulet curry coco。常规流程是先搜索,再阅读:search_recipes 会给出一个 id,get_recipe 会使用这个标识符。
工具
| 工具 | 功能 |
|---|---|
search_recipes | 按菜品或食材查找食谱。 |
get_recipe | 阅读食谱,并可按需适配份数。 |
scale_ingredients | 适配任意食材清单,无需向网站发起请求。 |
该服务只会读取内容,不会在 Marmiton 上发布任何内容。
search_recipes
按菜品或食材搜索食谱。Marmiton 会匹配单词的开头,因此搜索结果取决于网站为该查询分类的内容;如果标题中没有任何搜索词,响应会对此作出说明。
| 参数 | 类型 | 必填 | 功能 |
|---|---|---|---|
query | 字符串,最多 200 个字符 | 是 | 要搜索的内容,使用法语。 |
limit | 整数,1 到 30,默认值为 10 | 否 | 从此结果页返回的食谱数量。 |
**返回内容:**包含 id 的条目,供 get_recipe 使用;title;url;以及 image_url,对于已发布但没有照片的食谱,该字段为 null。还会返回 result_count 和 total_available,表示应用 limit 之前此页面上的食谱数量。Marmiton 的 robots.txt 禁止对搜索结果分页,因此每次搜索只会读取一个页面;请缩小搜索范围以查看其他食谱。
get_recipe
完整读取食谱;如果提供了份数,还会调整用量。
| 参数 | 类型 | 必填 | 功能 |
|---|---|---|---|
id | 数字字符串 | 二选一 | search_recipes 返回的 Marmiton 标识符。 |
url | 一个 marmiton.org 地址 | 二选一 | 食谱地址;未提供 id 时使用。 |
servings | 大于 0 且不超过 500 的数字 | 否 | 按指定份数调整用量。 |
返回内容:title、url、ingredients、steps、prep_minutes、cook_minutes、total_minutes、category、author、rating 和 nutrition;如果页面未发布相应信息,各字段的值为 null。yield 说明食谱原本的份数以及适配后的份数:original_count、original_text、requested、表示计数单位的 unit,以及所应用的乘数 factor。每种食材都包含 original、text、amount、表示区间的 amountMax、unit,以及取值为 scaled、rounded 或 unscaled 的 scaling。这些数字由该服务计算得出,因此展示时请说明它们已重新计算。nutrition 描述的是已发布食谱本身的营养信息,适用于其原有份数。
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,分别统计因四舍五入而改变数值的配料行数。
数量调整
每种配料都会附带一个 scaling 标记,说明数量经过调整后发生了什么变化。
| 标记 | 含义 | 示例 |
|---|---|---|
scaled | 数值按乘数直接计算得出。 | 3 oeufs ×2 → 6 oeufs |
rounded | 为了便于使用,对数值进行了调整。 | 25 cl de lait ×0,667 → 17 cl de lait |
unscaled | 没有数量,保持原样。 | sel、coriandre |
数量会使用适合的单位表示。因此,调整后的一行可能使用与原食谱不同的单位:200 g 乘以 20 得到 4 kg。
配料可分割的精细程度取决于其性质。法棍可以切成两份、三份或四份;鸡蛋则无法分割。因此,介于这些数值之间的数量会被四舍五入,调整后的食谱与原配方的比例会略有偏差。该行会标记为 rounded,其 note 会说明具体的处理方式。
配置
每个变量都是可选的。它们应放在客户端配置的 env 块中。
| 变量 | 默认值 | 功能 |
|---|---|---|
MARMITON_USER_AGENT | 项目标识 | 向 Marmiton 标识您的应用,并提供可联系到负责人的地址。 |
MARMITON_MIN_INTERVAL_MS | 1000 | 两次请求之间的间隔,范围为 500 到 60000。低于下限的值将被拒绝并改用默认值。 |
MARMITON_TIMEOUT_MS | 15000 | 单次请求的超时时间,范围为 1000 到 120000。 |
MARMITON_MAX_RETRIES | 3 | 临时失败后的重试次数,范围为 0 到 10。 |
MARMITON_CACHE_TTL_MS | 900000 | 页面在内存中的保留时长,范围为 0 到 86400000。 |
MARMITON_CACHE_MAX_ENTRIES | 200 | 同时保存在内存中的页面数,范围为 0 到 10000。 |
MARMITON_MAX_BODY_BYTES | 8000000 | 读取页面的最大大小(字节),范围为 100000 到 64000000。 |
MARMITON_LOG_LEVEL | error | silent、error、info 或 debug,输出到错误输出流。 |
超出范围的值将恢复为默认值,并在错误输出流中写明原因。
错误
每次失败都会带有六种代码之一和一条消息;有助于处理时,还会提供下一步操作建议。
| 代码 | 发生的情况 | 该怎么做 |
|---|---|---|
not_found | Marmiton 已响应,但没有这道食谱。 | 使用 search_recipes 检查标识符。 |
invalid_input | 请求发出前,参数已被拒绝。 | 阅读消息,其中会指出相关参数。 |
rate_limited | Marmiton 要求此客户端降低请求频率。 | 等待所示秒数,然后使用相同参数重试。食谱仍然存在。 |
parse_failure | 页面已加载,但缺少预期内容。 | 请在问题跟踪页反馈。 |
network_error | 请求未能完成。 | 稍后重试。 |
timeout | 请求超时。 | 增大 MARMITON_TIMEOUT_MS。 |
作为库使用
读取 Marmiton 的层单独发布,包含请求间隔、缓存和错误处理,不绑定任何协议。
import { MarmitonClient } from "mcp-marmiton/client";
const client = new MarmitonClient();
const { data, cached } = await client.getRecipe({ id: "18257" });
console.log(data.title, data.ingredients.length, cached);
search 和 getRecipe 各自返回 { data, cached },并会抛出带有六种代码之一的错误。两次请求之间的最小间隔在此处同样适用。
请求频率与署名
请求逐一发送,彼此之间至少间隔一段时间,无论配置如何,都会遵守这一最低间隔。User-Agent 始终以项目身份和联系人员的地址结尾。所有数据均从 Marmiton 为机器发布的 JSON-LD schema.org 中读取,并避开其 robots.txt 禁止访问的路径。
每条结果都包含食谱标题和地址;如果页面注明了作者,get_recipe 也会提供作者,以及写在同一行的 attribution、标题和地址。
食谱归 Marmiton 及撰写食谱的厨师所有。此 MCP 是一个非官方项目,与 Marmiton 无关联。
隐私
此服务不会收集您的任何信息,也不会向其作者发送任何信息。它在您的机器上运行,只连接 www.marmiton.org,在运行期间将响应保存在内存中,不会写入磁盘。PRIVACY.md 说明了请求会携带哪些信息,以及哪些设置会改变这一点。
开发
npm install
npm run build:fixtures
npm test
npm run check
测试使用生成的 fixtures 运行,不会发送任何请求。实时测试套件 npm run test:live 会为每个路由发送一个请求,并且每晚针对网站本身运行。
贡献
问题、疑问和想法都欢迎提交到问题跟踪。欢迎提交修改提案;先开一个问题单有助于就变更方案达成一致。请参阅 CONTRIBUTING.md。
许可证
MIT,详见 LICENSE。食谱归 Marmiton 及其作者所有。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。