mcp-recipes 是一个 MCP(Model Context Protocol)服务器,旨在解决食谱分散在不同网站、格式各异的问题。它能够同时搜索多个食谱语料库,读取食谱并以统一格式呈现,还支持重新缩放食材列表。该服务器无需 API 密钥或账户,可在本地运行。
用途
食谱通常分布在多个网站,每个网站有自己的语言、计量单位和份量定义。例如,法语烹饪网站用法语发布,使用自己的度量衡;英语维基食谱则包含设备列表和散文式描述。单独查询一个网站只能得到该网站的信息。mcp-recipes 通过同时读取六个来源,让用户能够跨来源搜索、比较和调整食谱。
主要能力
- 多来源搜索:使用单一查询搜索所有六个来源。来源包括三个法语网站(Marmiton、Ptitchef、Supertoinette)、两个英语网站(Wikibooks Cookbook、BBC Good Food)和一个西班牙语网站(Pequerecetas)。
- 统一格式读取:从任意来源读取食谱,并以统一格式返回,包括标题、地址、食材(每行带有缩放信息和是否为设备)、步骤以及请求的章节。某个来源没有的字段会缺失,而不是编造。
- 食谱比较:将同一道菜的多个版本并排比较,所有版本缩放到相同的份量,以便比较数量。
- 食材缩放:重新缩放任意食材列表,无需请求任何网站。可以指定缩放因子,或指定原始份量和目标份量。支持自动识别每行语言,或指定语言。
- 独立来源报告:每个来源的状态单独报告,失败、未询问和返回空结果被区分为三种不同情况。
使用方式
安装
- 一键安装:适用于 Claude Desktop、Cursor 及任何使用标准配置格式的客户端。需要 Node 24 或更高版本,无需设置环境变量。
- Bundle 安装:下载最新版本的 mcp-recipes-4.0.0.mcpb 并打开。支持 MCP bundle 的客户端会自动安装,无需 npm 或编辑配置文件。Bundle 包含依赖,安装时不会下载任何内容。
- npm 安装:可通过 npm 安装,具体命令未在资料中提供。
配置
- 容器需要出站 HTTPS 访问以下域名:www.marmiton.org、api.wikimedia.org、www.ptitchef.com、www.bbcgoodfood.com、www.supertoinette.com 和 www.pequerecetas.com。不需要卷、端口或凭据。
- 所有变量都是可选的,可在客户端配置的 env 块中设置。超出范围的值会回退到默认值,原因写入 stderr。
典型查询示例
- "Find me carbonara recipes, from wherever you can."
- "Compare the French and English versions of that dish."
- "Read the second one for eight people."
- "Which of them uses cream?"
- "Scale this list from my notebook by 1.5."
工具
- search_recipes:用单一问题搜索所有来源。返回 results(包含 id、source、source_name、title、url、image_url、excerpt)和 per_source 报告(包含 status、count、reported_total、reported_total_means、names_the_dish、order)。
- get_recipe:从任意来源读取一个食谱,统一格式。返回 kind(recipe 或 collection)、recipe 或 collection。recipe 包含标题、地址、食材(每行有 scaling 和 is_equipment)、步骤和请求的章节。collection 是收集其他食谱的文章,包含标题和指向的食谱。
- compare_recipes:将同一道菜的多个版本并排比较。返回 versions(每个来源一个食谱,缩放到相同份量)和 differences。
- scale_ingredients:重新缩放任意食材列表,不请求任何网站。可传递 factor,或 from_servings 和 to_servings 对。auto 会单独读取每一行,适合多语言列表;指定语言则按该语言读取所有行。返回缩放后的行,格式与 get_recipe 相同,每行带有 scaling。
缩放细节
- 数量可能以不同单位返回,例如 200 g 乘以二十显示为 4 kg。
- 食材的可分割性不同:法棍可以切成两半、三份或四份;鸡蛋不能分割。落在两者之间的数量会舍入,缩放后的食谱会略微偏离原始比例。行会带有 rounded 标记,note 说明做了什么。
- 来源用自己的语言书写数量,行按其书写语言读取。数字是该服务器的算术结果,展示时应说明是重新计算的。
来源报告
每个答案单独说明每个来源的情况。失败、未询问和返回空结果是三种不同情况,分别报告。总数与发布它的来源一起保留,并说明该来源计数的是什么:一个网站计数整个类别,另一个计数它提供的行,第三个不发布总数。
错误处理
每个失败都带有六种代码之一、一条消息,以及(在有用时)提示下一步操作。一个来源失败会按来源报告,而不是使整个答案失败,因此一个沉默的网站不会隐藏其他网站。
独立发布的层
读取网站的层单独发布,包含其节奏、缓存和错误,不附带协议。
- searchRecipes(query, limitPerSource, sources?, options?) 返回 { rows, reports }:每个来源一个报告,说明是否回答以及其计数测量的是什么,因此失败的来源永远不会被读作没有内容的来源。
- getRecipe(id) 返回 { recipe, cached, read },并抛出带有六种代码之一的错误。
- client.profiles 列出构建注册的来源。
缩放器单独发布在 mcp-recipes/scale,可离线处理任何列表。
节奏和归属
- 每个网站有自己的节奏,一次一个请求。每个网站有自己的下限,任何配置都不能低于:Marmiton 和 Cookbook 为半秒,Ptitchef 和 BBC Good Food 为一秒,Supertoinette 和 Pequerecetas 为三秒。为所有来源设置的间隔可以提高某个网站的间隔,但永远不会降低。
- User-Agent 始终以项目标识和可联系到人的地址结尾。
- 每行都带有食谱自己页面的地址和发布它的网站名称。
- Cookbook 页面在 CC BY-SA 4.0 下发布,要求基于它们构建的内容以相同许可证共享。Marmiton、Ptitchef、BBC Good Food、Supertoinette 和 Pequerecetas 在食谱页面上未声明条款,其食谱属于这些网站和编写它们的厨师。沉默不是授予,因此请注明网站并链接你获取食谱的页面。
- BBC Good Food 为订阅者保留的食谱返回时没有食材和方法,标记为保留的食谱,并带有其页面地址。此服务器不会重建该网站选择出售的内容。
- 网站发布的难度和成本两个数字不在此重复。难度是每个网站用自己的方式写的词,没有发布任何尺度,因此无法放在任何轴上比较两个版本。成本在一个网站上是欧元价格,在另一个网站上是其列表内的排名,一个字段同时容纳两者会诱使它们被比较。
适用场景
- 需要跨语言比较同一道菜的不同版本。
- 需要调整食谱份量或缩放食材列表。
- 需要从多个来源搜索食谱并统一格式查看。
- 需要整合不同网站的食谱信息。
限制
- 需要 Node 24 或更高版本。
- 某些网站有请求间隔限制,服务器会遵守这些限制。
- BBC Good Food 的订阅者专属食谱不会返回食材和步骤。
- 难度和成本字段不重复提供。
- 该服务器是非官方项目,与所读取的任何网站无关联。
- 不收集用户数据,不向作者发送任何内容。在本地运行,仅联系上述六个网站,答案保存在内存中,不写入磁盘。
- 测试针对生成的固定装置运行,不进行网络请求。实时测试套件 npm run test:live 每晚对网站本身运行,每个路由一个请求。
- 错误、问题和想法请提交到 issue tracker。欢迎 pull request;先开 issue 有助于就变更形式达成一致。参见 CONTRIBUTING.md。
- 许可证为 MIT,参见 LICENSE。食谱属于发布它们的网站及其作者。