关于 mcp-wikibooks-cookbook
mcp-wikibooks-cookbook 将聊天客户端连接到英文 Wikibooks Cookbook。它支持食谱搜索、分类列表和份量调整,也可缩放单独提供的食材清单。
主要功能
- 01按菜名或食材搜索食谱
- 02读取食谱并调整份量
- 03按菜系、菜品类型或主食材列出食谱
- 04缩放任意食材清单
适用场景
- 01按菜名或食材查找食谱
- 02按指定人数调整食谱份量
- 03按菜系或菜品类型浏览食谱
- 04缩放自备的食材清单
MCP 相关
向 MCP 客户端提供 Wikibooks Cookbook 搜索、食谱详情、分类列表和食材缩放工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
4收录的工具列表 · 更新于 今天
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| limit | integer | 否 | |
| query | string | 是 | 菜品,例如 'carbonara',或食材,例如 'guanciale'。 |
| search | enum | 否 | 'text' 搜索整个页面;'title' 仅匹配页面名称。text | title |
详细介绍
mcp-wikibooks-cookbook
食谱是英文 Wikibooks(Wikimedia 的一个项目)中的食谱集。数千种食谱在这里以开放方式编写和维护,每种食谱都列出了所需食材、设备、步骤、作者补充的提示和变化,以及所属类别:菜系、菜肴类型和主要食材。页面采用 Creative Commons Attribution-ShareAlike 4.0 许可发布。
此 MCP 服务将聊天客户端连接到这个食谱集。你可以按菜肴或食材搜索食谱,按菜系、菜肴类型或主要食材浏览,也可以阅读一份食谱,并按餐桌人数调整食材用量;还可以调整自己的任意食材清单。无需 API 密钥或账户。
安装
一键安装
Claude Code
claude mcp add wikibooks-cookbook -- npx -y mcp-wikibooks-cookbook
Claude Desktop、Cursor 及任何使用标准配置格式的客户端
{
"mcpServers": {
"wikibooks-cookbook": {
"command": "npx",
"args": ["-y", "mcp-wikibooks-cookbook"]
}
}
}
需要 Node 24 或更高版本,无需设置环境变量。
使用 Docker
{
"mcpServers": {
"wikibooks-cookbook": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-wikibooks-cookbook:2.1.0"]
}
}
}
-i 会保持标准输入开启,协议通过该输入流传输;省略 -t 是因为 TTY 会改写数据流。容器需要能够通过 HTTPS 访问 api.wikimedia.org,除此之外不需要任何东西:无需卷、端口或凭据。
使用 Bundle,无需 npm
从最新版本下载 mcp-wikibooks-cookbook-2.1.0.mcpb 并打开。支持 MCP bundle 的客户端会自动安装,无需 npm,也无需编辑配置文件。Bundle 包含所需依赖,因此安装时不会下载任何内容。
可以问什么
- “在 Cookbook 中帮我找一个意式培根蛋面食谱。”
- “把份量改成 6 人份,而不是 4 人份。”
- “这个食谱集中有哪些泰式汤品?”
- “哪些食谱以扁豆为主要食材?”
- “帮我把这份食材清单的用量乘以 2.5。”
常见流程是先搜索,再查看食谱:每一行都带有一个 id,也就是页面键,get_recipe 接收这个键。
工具
| 工具 | 功能 |
|---|---|
search_recipes | 按菜品或食材查找食谱。 |
get_recipe | 查看一道食谱,并可按需缩放至指定份数。 |
scale_ingredients | 缩放任意食材清单,无需请求 wiki。 |
list_recipes | 按菜系、菜品类型或主要食材列出食谱。 |
search_recipes
搜索 Cookbook,可搜索页面的全文,也可仅搜索页面标题。
| 参数 | 类型 | 必填 | 功能 |
|---|---|---|---|
query | 字符串,1 到 300 个字符 | 是 | 菜品,例如 carbonara,或食材,例如 guanciale。 |
search | text 或 title,默认 text | 否 | text 搜索全文;title 仅匹配页面名称。 |
limit | 整数,1 到 50,默认 10 | 否 | 返回的行数。 |
返回内容: 各行包含 id(即 get_recipe 接收的页面键)、title、
url、image_url、description(wiki 为页面保留的简短介绍)以及
excerpt(移除高亮标记后的匹配段落)。如果搜索结果中没有后三项中的某项,其值为 null。total_available 始终为 null:搜索接口不提供总数或分页,因此 result_count
表示本次调用返回的行数。
get_recipe
查看一道食谱;如果提供份数,则缩放其食材用量。
| 参数 | 类型 | 必填 | 功能 |
|---|---|---|---|
id | 字符串,1 到 300 个字符 | 是 | 页面键,例如 Cookbook:Spaghetti_alla_Carbonara。 |
servings | 整数,1 到 500 | 否 | 将食材用量缩放至指定份数。 |
max_description_chars | 整数,100 到 20000,默认 1200 | 否 | 返回的页面正文长度。 |
返回内容: title、url、ingredients、equipment、steps、tips(页面提供的备注和变化做法)、prep_minutes、cook_minutes、
total_minutes、页面原文中的 time_text、time_phases、category,以及页面归属的所有类别 categories。页面未说明的数值为 null。id 表示实际读取的页面;如果发生重定向,它可能与请求的键不同,此时 redirected_from 会显示引导至该页面的键。yield 说明食谱原本的份数以及缩放后的份数,每种食材都带有 scaling,其值为 scaled、rounded 或 unscaled。
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。
list_recipes
按 Cookbook 文件中使用的类别列出食谱。参数可以组合使用,回答会说明据此构建的搜索条件。
| 参数 | 类型 | 必填 | 作用 |
|---|---|---|---|
cuisine | 最多 80 个字符的字符串 | 否 | 菜系或国家/地区,例如 Italian 或 Thai。 |
dish_type | 最多 80 个字符的字符串 | 否 | 菜肴类型,例如 soup、dessert 或 bread。 |
main_ingredient | 最多 80 个字符的字符串 | 否 | 食谱主要使用的配料。 |
limit | 1 到 50 的整数,默认值为 15 | 否 | 返回的行数。 |
返回内容:search_recipes 返回的行,其中 query 会说明此服务根据参数构建的搜索条件;每个参数也会原样返回,未提供的参数则返回 null。
数量缩放
数量会以适合的单位表示,因此返回的行可能使用与食谱原文不同的单位:将 200 g 乘以 20 后会显示为 4 kg。
配料可以细分到什么程度取决于配料本身。面包可以切成两份、三份或四份;鸡蛋则无法分割。若计算出的数量介于两者之间,就会进行四舍五入,此时缩放后的食谱与原始比例会略有偏差。该行会标记为 rounded,备注中会说明处理方式。
这些数字是此服务计算得出的,因此展示时请说明它们是重新计算的。如果食谱页面没有注明份数,就无法换算成指定人数的份量,回答也会说明这一点。
许可与署名
Cookbook 页面依据
知识共享署名-相同方式共享 4.0 许可发布。
复用食谱时,必须注明 Wikibooks 及其来源页面,并以相同许可共享基于该食谱创作的内容。get_recipe 会返回 license 和页面 url,因此回答会包含相应署名。
配置
所有变量均为可选项。请在客户端配置的 env 块中设置。
| 变量 | 默认值 | 用途 |
|---|---|---|
WB_USER_AGENT | 项目标识 | 向 Wikimedia 标识你的应用,并提供可联系到相关人员的地址。 |
WB_MIN_INTERVAL_MS | 1000 | 两次请求之间的间隔,范围为 500 到 60000。 |
WB_TIMEOUT_MS | 20000 | 单次请求的截止时间,范围为 1000 到 120000。 |
WB_MAX_RETRIES | 3 | 临时故障后的重试次数,范围为 0 到 8。 |
WB_CACHE_TTL_MS | 900000 | 页面在内存中的保留时间,范围为 0 到 86400000。 |
WB_CACHE_MAX_ENTRIES | 200 | 内存中同时保留的页面数,范围为 1 到 5000。 |
WB_MAX_BODY_BYTES | 8000000 | 可读取的页面最大字节数,范围为 100000 到 64000000。 |
WB_LOG_LEVEL | error | silent、error、info 或 debug,输出到 stderr。 |
超出范围的值会回退到默认值,原因会写入 stderr。
错误
每种失败都带有六种代码之一和一条消息;适用时还会附上提示,说明下一步该怎么做。
| 代码 | 发生了什么 | 怎么做 |
|---|---|---|
not_found | Wiki 已作出响应,但没有该页面。 | 使用 search_recipes 检查页面键。 |
invalid_input | 请求发出前,参数已被拒绝。 | 阅读消息,其中会指出相关参数。 |
rate_limited | Wikimedia 要求此客户端放慢请求速度。 | 等待提示中指出的秒数,然后使用相同参数再次调用。食谱仍然存在。 |
parse_failure | 页面已加载,但缺少预期内容。 | 在问题跟踪器中报告。 |
network_error | 请求未能完成。 | 稍后重试。 |
timeout | 请求超过了截止时间。 | 提高 WB_TIMEOUT_MS,或减少请求的行数。 |
作为库使用
读取 Wiki 的这一层单独发布,包含自己的请求间隔控制、缓存和错误处理,且不绑定任何协议。
import { WikibooksClient } from "mcp-wikibooks-cookbook/client";
const client = new WikibooksClient();
const { data, cached } = await client.getRecipe("Cookbook:Spaghetti_alla_Carbonara");
console.log(data.title, data.ingredients.length, cached);
search 和 getRecipe 都会返回 { data, cached },并抛出携带六种代码之一的错误。此处同样会限制两次请求之间的最短间隔。
请求节奏与归属信息
请求逐个发出,间隔至少一秒;无论如何配置服务器,最低间隔都为半秒。User-Agent 始终以项目标识和可联系到负责人的地址结尾。
读取请求会发送到 api.wikimedia.org,这是 Wikimedia 为开发者提供并维护的主机。每条结果都会附上读取页面的地址,以及该页面发布时采用的许可协议。
此 MCP 服务是一个非官方项目,与 Wikimedia 或 Wikibooks 社区均无关联。
隐私
此服务不会收集你的任何信息,也不会向作者发送任何信息。它在你的计算机上运行,只会连接 api.wikimedia.org,运行期间会将回答保存在内存中,不会写入磁盘。
PRIVACY.md 说明了请求会携带哪些信息,以及哪些设置会影响这些信息。
开发
npm install
npm run build:fixtures
npm test
npm run check
测试使用生成的 fixture 运行,不会发出网络请求。实时测试套件 npm run test:live 会为每个路由发出一个请求,并于每晚针对服务本身运行。
贡献
错误报告、问题和想法请提交至问题跟踪器。 欢迎提交拉取请求;先创建问题有助于就变更方案达成一致。请参阅 CONTRIBUTING.md。
许可
此服务自身代码采用 MIT 许可,详见 LICENSE。Cookbook 页面归其作者和 Wikibooks 社区所有,采用 CC BY-SA 4.0 许可。
mcp-wikibooks-cookbook(法语)
Cookbook 是英语 Wikibooks 中的食谱合集。Wikibooks 是 Wikimedia 的一个项目。数千道食谱在这里公开编写和维护,每道食谱都包含食材、所需器具、步骤、作者添加的建议和变体,以及所属类别:菜系、菜品类型、主要食材。页面采用知识共享署名—相同方式共享 4.0 许可协议发布。
此服务将对话客户端连接到这个合集。你可以按菜品或食材搜索食谱,按菜系、菜品类型或主要食材列出食谱,阅读食谱并根据用餐人数调整食材用量,还可以调整任意食材列表。无需 API 密钥,也无需账号。
安装
一键安装
Claude Code
claude mcp add wikibooks-cookbook -- npx -y mcp-wikibooks-cookbook
Claude Desktop、Cursor 及所有采用标准配置格式的客户端
{
"mcpServers": {
"wikibooks-cookbook": {
"command": "npx",
"args": ["-y", "mcp-wikibooks-cookbook"]
}
}
}
需要 Node 24 或更高版本,无需设置任何环境变量。
使用 Docker
{
"mcpServers": {
"wikibooks-cookbook": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-wikibooks-cookbook:2.1.0"]
}
}
}
-i 会保持标准输入打开,它是协议通道;省略 -t 是因为 TTY 会重写数据流。容器只需能够通过 HTTPS 访问 api.wikimedia.org,除此之外不需要任何东西:无需卷、端口或凭据。
打包,无需 npm
从最新版本发布
下载 mcp-wikibooks-cookbook-2.1.0.mcpb 并打开。支持 MCP 捆绑包的客户端会自动安装,无需 npm,也无需修改配置文件。捆绑包包含其依赖项,因此安装时不会下载任何内容。
可以询问什么
- “在 Cookbook 中帮我找一道培根蛋面食谱。”
- “把它调整为六人份,而不是四人份。”
- “这个合集里有哪些泰式汤品?”
- “有哪些食谱以扁豆为主料?”
- “把这份配料清单的用量乘以 2.5。”
常见流程是先搜索,再读取:一行结果包含 id,即页面键;get_recipe 会使用这个键。
工具
| 工具 | 功能 |
|---|---|
search_recipes | 按菜品或食材查找食谱。 |
get_recipe | 读取食谱,并可按需调整份数。 |
scale_ingredients | 调整任意配料清单的用量,无需查询 wiki。 |
list_recipes | 按菜系、菜品类型或主要食材列出食谱。 |
search_recipes
在 Cookbook 中搜索,可以搜索页面的全部文本,也可以只搜索页面标题。
| 参数 | 类型 | 必填 | 功能 |
|---|---|---|---|
query | 字符串,1 到 300 个字符 | 是 | 一道菜,如 carbonara,或一种食材,如 guanciale。 |
search | text 或 title,默认值为 text | 否 | text 搜索整页;title 仅匹配页面名称。 |
limit | 整数,1 到 50,默认值为 10 | 否 | 返回的行数。 |
**返回内容:**包含 id 的行,即 get_recipe 会使用的页面键;title;url;image_url;description,即 wiki 为页面保留的简短说明;以及 excerpt,即去除高亮标记后的匹配片段。如果搜索未提供以上后三项中的某项,其值为 null。total_available 始终为 null:搜索接口不提供总数或分页信息,因此 result_count 统计本次调用返回的行数。
get_recipe
读取食谱;如果指定了份数,则会调整食材用量。
| 参数 | 类型 | 必填 | 功能 |
|---|---|---|---|
id | 字符串,1 至 300 个字符 | 是 | 页面键,例如 Cookbook:Spaghetti_alla_Carbonara。 |
servings | 整数,1 至 500 | 否 | 将食材用量调整为指定份数。 |
max_description_chars | 整数,100 至 20000,默认值为 1200 | 否 | 返回的页面正文长度。 |
返回: title、url、ingredients、equipment、steps、tips(页面发布的
备注和变体)、prep_minutes、cook_minutes、total_minutes、页面原文中的
time_text、time_phases、category,以及页面所属的每个类别对应的 categories。
页面未提供的数字为 null。id 表示读取的页面;如果发生重定向,它会与请求的键不同,
此时 redirected_from 表示重定向来源键。yield 表示食谱适用的份数以及调整后的份数,
每种食材都带有 scaling,其值为 scaled、rounded 或 unscaled。
scale_ingredients
对任意食材列表应用相同的计算方式,不向 wiki 发出请求。
| 参数 | 类型 | 必填 | 功能 |
|---|---|---|---|
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。
list_recipes
根据 Cookbook 为食谱归入的类别列出食谱。参数可以组合使用,响应会说明据此构建的搜索内容。
| 参数 | 类型 | 必填 | 功能 |
|---|---|---|---|
cuisine | 字符串,最多 80 个字符 | 否 | 菜系或国家/地区,例如 Italian 或 Thai。 |
dish_type | 字符串,最多 80 个字符 | 否 | 菜品类型,例如 soup、dessert 或 bread。 |
main_ingredient | 字符串,最多 80 个字符 | 否 | 食谱的主要食材。 |
limit | 整数,1 至 50,默认值为 15 | 否 | 返回的行数。 |
返回: search_recipes 返回的行,其中 query 表示此服务根据参数构建的搜索内容,
并逐一返回每个参数;未提供的参数则为 null。
数量调整
数量会以合适的单位表示。因此,调整后,某一行可能使用与食谱不同的单位:200 g
乘以 20 得到 4 kg。
食材可细分到什么程度,取决于其性质。面包可以切成两份、三份或四份;鸡蛋则无法分割。因此,落在两者之间的数量会被取整,调整后的食谱也就与原食谱的比例略有偏差。该行会标记为 rounded,其备注会说明具体处理方式。
这些数字是此服务计算得出的,因此展示时请说明它们已重新计算。如果食谱页面未注明份数,就无法将其调整为指定用餐人数,响应中会说明这一点。
许可与署名
Cookbook 页面采用
知识共享署名-相同方式共享 4.0许可发布。
复用食谱时,必须注明 Wikibooks 和食谱来源页面,并以相同许可分享基于它构建的内容。get_recipe 会同时返回 license 和页面的 url,因此响应中也会附带署名信息。
配置
所有变量均为可选项。请将它们设置在客户端配置的 env 块中。
| 变量 | 默认值 | 作用 |
|---|---|---|
WB_USER_AGENT | 项目标识 | 向 Wikimedia 标识您的应用,并提供一个可联系到相关人员的地址。 |
WB_MIN_INTERVAL_MS | 1000 | 两次请求之间的间隔,范围为 500 至 60000。 |
WB_TIMEOUT_MS | 20000 | 请求超时时间,范围为 1000 至 120000。 |
WB_MAX_RETRIES | 3 | 临时故障后的重试次数,范围为 0 至 8。 |
WB_CACHE_TTL_MS | 900000 | 页面在内存中的缓存时长,范围为 0 至 86400000。 |
WB_CACHE_MAX_ENTRIES | 200 | 同时保留在内存中的页面数,范围为 1 至 5000。 |
WB_MAX_BODY_BYTES | 8000000 | 读取页面的最大字节数,范围为 100000 至 64000000。 |
WB_LOG_LEVEL | error | silent、error、info 或 debug,输出到错误输出流。 |
超出范围的值会恢复为默认值,原因会写入错误输出流。
错误
每次失败都会带有六种代码之一、一条消息,并在有帮助时提供下一步操作提示。
| 代码 | 发生了什么 | 怎么做 |
|---|---|---|
not_found | Wiki 已响应,但没有此页面。 | 使用 search_recipes 检查页面键。 |
invalid_input | 参数在发出任何请求前就被拒绝。 | 阅读消息,其中会指出相关参数。 |
rate_limited | Wikimedia 要求此客户端降低请求频率。 | 等待指定的秒数,然后使用相同的参数重试。食谱仍然存在。 |
parse_failure | 页面已加载,但缺少预期内容。 | 在问题跟踪页中报告。 |
network_error | 请求未能完成。 | 稍后重试。 |
timeout | 请求超时。 | 增大 WB_TIMEOUT_MS,或请求更少的行。 |
作为库使用
读取 Wiki 的这一层单独发布,拥有自己的节奏、缓存和错误,不绑定任何协议。
import { WikibooksClient } from "mcp-wikibooks-cookbook/client";
const client = new WikibooksClient();
const { data, cached } = await client.getRecipe("Cookbook:Spaghetti_alla_Carbonara");
console.log(data.title, data.ingredients.length, cached);
search 和 getRecipe 各自返回 { data, cached },并会抛出带有六种代码之一的错误。两次请求之间的最短间隔在这里同样适用。
请求频率与署名
请求会逐个发出,间隔至少一秒,并且无论如何配置,最短间隔都不会低于半秒。User-Agent 始终以项目身份和个人联系地址结尾。
读取请求会发送到 api.wikimedia.org,这是 Wikimedia 为开发者提供文档并维护的主机。每个结果都附有读取该内容的页面地址,以及该页面发布所依据的许可证。
此 MCP 是一个非官方项目,与 Wikimedia 和 Wikibooks 社区均无关联。
隐私
此服务不会收集你的任何信息,也不会向其作者发送任何内容。它在你的计算机上运行,只连接 api.wikimedia.org,在运行期间将响应保存在内存中,并且不会写入磁盘。PRIVACY.md 说明了请求会携带哪些信息,以及哪些设置可以改变这一点。
开发
npm install
npm run build:fixtures
npm test
npm run check
测试使用生成的 fixture 运行,不会发出任何请求。实时测试套件 npm run test:live 会对每个路由发出一个请求,并且每晚直接针对服务运行。
贡献
问题、疑问和想法都可以提交到问题跟踪页。欢迎提交修改建议;先开一个工单有助于就修改方案达成一致。请参阅 CONTRIBUTING.md。
许可证
此服务代码采用 MIT 许可证,详情请见 LICENSE。Cookbook 页面归其作者和 Wikibooks 社区所有,采用 CC BY-SA 4.0 许可证。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。