关于 Cook (Cooklang recipes)
Cook 是一个本地 MCP 服务,让 AI Agent 管理文件夹中的 Cooklang 食谱和菜单文件。它支持搜索、校验、编辑、购物清单和库存管理;登录 cook.md 后还可使用营养计算及图片和链接导入。
主要功能
- 01读取、搜索与校验食谱
- 02编写食谱和菜单文件
- 03按菜单生成购物清单
- 04追踪库存与临期食材
- 05渲染自定义报告
- 06营养计算与食谱导入
适用场景
- 01规划一周菜单并生成采购清单
- 02检查食谱集合中的错误引用
- 03根据库存寻找可制作的菜肴
- 04从网页或照片导入食谱
MCP 相关
MCP 服务通过工具、提示词和资源向 MCP 客户端提供 Cooklang 食谱操作能力。食谱文件保存在本地指定目录中;营养计算及部分导入功能需要 cook.md 登录。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
cook-mcp
一个 MCP 服务,可让你的 AI Agent(Claude Code、Claude Desktop、Cursor、ChatGPT 或任何其他 MCP 客户端)访问你的 Cooklang 食谱收藏。食谱以普通的 .cook 和 .menu 文件形式保存在你拥有的文件夹中。Agent 可以读取、搜索、验证和编写这些文件,生成购物清单、跟踪食品储藏室库存并渲染报告,所有操作都在本地进行,无需账户。使用 cook.md 登录后,它还可以计算营养信息,并从照片和社交链接导入食谱。
安装
Claude Code:
claude mcp add cook -- npx -y @cookmd/mcp
适用于接受 mcpServers 配置的任何客户端:
{
"mcpServers": {
"cook": {
"command": "npx",
"args": ["-y", "@cookmd/mcp"],
"env": { "COOK_RECIPES_DIR": "/path/to/recipes" }
}
}
}
如果未设置 COOK_RECIPES_DIR,服务将使用客户端共享的工作区文件夹,或客户端启动时所在的文件夹。请参阅如何选择食谱文件夹。
支持的平台:macOS(arm64、x64)和 Linux(x64、arm64、glibc 2.35 或更高版本)。目前尚无 Windows 构建版本。
特定客户端的设置说明:https://cook.md/help/mcp
Claude Code 插件
Claude Code 用户可以安装 cooklang 插件,无需手动添加服务。该插件位于 cooklang/cooklang-skills,包含此服务以及以下技能:
/plugin marketplace add cooklang/cooklang-skills
/plugin install cooklang@cooklang-skills
该插件会以你的 Claude Code 项目文件夹作为食谱根目录启动服务,而 Claude Code 会根据你的请求选择合适的技能(“规划下周的晚餐”“这份食谱有效吗?”)。如果你已经通过 claude mcp add cook 添加了服务,请移除该条目,以免同时运行两个副本。
这些技能也由此服务作为 cooklang://skills/<name> 资源提供:
| 技能 | 适用场景 |
|---|---|
cooklang-editing | 编写新食谱,或编辑并修复 .cook 文件 |
cooklang-validation | 检查食谱、文件夹或整个收藏中的错误和失效引用 |
metadata | 添加或修复 YAML frontmatter(标题、标签、份数、时间),包括批量更改 |
recipe-import | 从 URL、照片或粘贴的文本导入食谱 |
recipe-search | 按食材、标签、菜系、课程或记忆中的短语查找食谱 |
scale-recipe | 按更多或更少的份数调整食谱 |
export-recipe | 将食谱转换为 Markdown、JSON、纯文本或 HTML |
organize-collection | 文件夹布局、元数据审计、货架和食品储藏室配置、整个食谱库检查 |
meal-planning | 创建或编辑 .menu 膳食计划 |
shopping-list | 根据食谱或计划生成购物清单,按货架分组,并扣除食品储藏室中的库存 |
pantry | 跟踪库存、保质期和低库存物品;查询现有食材能做什么 |
report-authoring | 使用 render_report 创建自定义 Jinja 报告和打印件 |
nutrition-reports | 营养评估和筛查(Cook Basic 或 Pro) |
nutrition-goals | 调整食谱或计划以达到营养目标(Cook Basic 或 Pro) |
此代码库中的 skills/ 是规范副本;插件代码库会与其同步。每项技能都位于 skills/<name>/SKILL.md。
工具
免费(本地使用,无需登录)
| 工具 | 功能 |
|---|---|
list_recipes | 列出食谱、菜单或报告模板(kind:recipe、menu、template、all) |
read_recipe | 读取食谱或菜单:源内容以及解析后的食材、厨具、步骤和元数据;可选缩放份量 |
search_recipes | 搜索名称和内容,可按标签筛选 |
validate | 检查文件、文件夹、整个集合或未保存的内容,查找错误和失效引用 |
write_recipe | 保存 .cook 食谱(先验证) |
write_menu | 保存 .menu 菜单(先验证) |
write_config | 保存 config/aisle.conf、config/pantry.conf,或保存在 reports/ 或 config/reports/ 下的 .jinja 报告模板 |
shopping_list | 根据食谱和/或菜单生成购物清单:合并重复项目、按货架分组,并扣除食品储藏室中的存货 |
pantry_list | 按区域显示食品储藏室中的存货 |
pantry_expiring | 即将过期的物品 |
pantry_depleted | 库存低于或等于最低库存阈值的物品 |
pantry_recipes | 显示利用食品储藏室现有食材可以烹制哪些食谱 |
pantry_update | 添加、更新或移除食品储藏室中的物品 |
render_report | 使用食谱或菜单作为数据,渲染 jinja 报告模板(普通模板无需登录) |
Cook Basic / Pro(cook.md 登录)
| 工具 | 功能 |
|---|---|
login | 启动 cook.md 设备登录;显示代码和 URL |
auth_status | 显示登录状态、方案和导入额度 |
get_nutrition | 查询指定食材用量的营养成分 |
aggregate_nutrition | 汇总多行食材的营养成分 |
lookup_ingredient | 模糊搜索食材目录 |
convert_units | 在单位之间进行换算(体积换算为质量需要密度) |
check_category | 检查食材是否属于某个类别 |
branded_lookup | 通过条形码或文本查询包装产品 |
reference_intakes | 每日参考摄入量表(RDA/DV) |
import_recipe | 将网页、照片或粘贴的文本转换为 Cooklang |
从网页或粘贴的文本导入食谱时,import_recipe 无需登录。导入照片和社交媒体链接需要 cook.md 账户,并会使用导入额度。它会返回 Cooklang 文本,但不会保存;Agent 会先验证文本,再调用 write_recipe。render_report 中的营养计算功能也需要 Cook Basic 或 Pro。
提示词和资源
提示词:meal-planning、shopping-list、pantry、import-recipe、edit-recipe、nutrition-report、nutrition-goals、scale-recipe。
资源:
cooklang://spec:Cooklang 规范cooklang://syntax:语法参考cooklang://menu-format:.menu菜单格式cooklang://skills/<name>:Agent 工作指南,上表中每项技能各有一份:cooklang-editing、cooklang-validation、export-recipe、meal-planning、metadata、nutrition-goals、nutrition-reports、organize-collection、pantry、recipe-import、recipe-search、report-authoring、scale-recipe、shopping-list
安全
- 写入操作仅限食谱根目录。目录外的路径会被拒绝。
- 每次写入前都会进行验证;无效的 Cooklang 不会保存。
- 已弃用的
>>元数据语法会被拒绝。请使用 YAML frontmatter。 - 没有删除工具。Agent 无法移除您的文件。
已知限制
- 购物清单中的库存扣减仅在单位相同时有效。例如,食品储藏室中的 1 kg 无法抵消食谱中的 200 g。这是 cookcli-core 的限制。
- 通常不会跟随食谱文件夹中的符号链接来读取和列出内容。通过不带扩展名的裸名称请求的符号链接,或经由食谱中的
@./引用访问的符号链接,仍可能会被跟随。只有当您在食谱中放入指向文件夹外部的符号链接时,才会受到影响。 - 暂无 Windows 版本。
- 没有删除工具。
环境变量
| 变量 | 默认值 | 含义 |
|---|---|---|
COOK_RECIPES_DIR | 客户端的根目录,然后是其工作目录 | 菜谱根目录。所有路径均相对于它。设置后始终优先。 |
COOKMD_BASE_URL | https://cook.md | 登录、权限、导入 |
NUTRITION_API_URL | https://nutrition.cook.md | 营养服务 |
NUTRITION_API_TOKEN | 无 | 组织密钥或预先生成的令牌。优先于已存储的登录信息。 |
COOK_MCP_AUTH_PATH | ~/.config/cook-mcp/auth.json | 令牌存储位置。旧的 NUTRITION_MCP_AUTH_PATH 仍可用作别名。 |
如何选择菜谱文件夹
- 如果已设置
COOK_RECIPES_DIR,则使用它。不会查询其他位置。 - 客户端的 MCP 根目录。如果客户端支持根目录(会将已打开的工作区文件夹共享给服务),则第一个已存在的
file://文件夹会成为菜谱根目录。服务会在首次调用菜谱工具时询问,并在客户端报告根目录变更时再次询问。如果客户端在 5 秒内没有回应,服务会使用工作目录,并在稍后再次询问(最多每 30 秒一次)。 - 客户端启动服务时所在的文件夹。
根目录是你主动打开的文件夹,因此除非它是 /、你的主目录或位于 Agent 插件安装文件夹内(例如 ~/.codex/plugins/cache/...、~/.gemini/extensions/...,或 CLAUDE_PLUGIN_ROOT 指向的文件夹),否则会使用它。工作目录的检查更严格:如果工作目录本身或向上最多四层的文件夹中存在 .claude-plugin/plugin.json、Agent 插件的 plugin.json 或 gemini-extension.json,也会拒绝使用,因为如果插件在自己的安装文件夹中启动服务,就会暴露错误的文件,并将菜谱写入更新时会被清除的文件夹。如果找不到可用位置,菜谱工具会说明未设置菜谱文件夹及原因,并指出可通过 COOK_RECIPES_DIR 修复;auth_status 会显示 recipe_root_source: "unset"。否则,recipe_root_source 的值为 env、roots 或 cwd。
各客户端的行为:
-
Claude Code 会将其项目文件夹作为根目录发送(已验证),因此无需配置。
-
Codex 不会发送根目录(已在 0.160.1 版本验证),且可能在插件文件夹中启动服务,因此请设置
COOK_RECIPES_DIR:codex mcp add cook --env COOK_RECIPES_DIR=/path/to/recipes -- npx -y @cookmd/mcp -
VS Code 和 Cursor 的文档说明支持根目录(此处未经验证)。如果菜谱工具提示未设置文件夹,请在服务的配置中设置
COOK_RECIPES_DIR。
可以询问的内容
- “根据我的菜谱规划下周的晚餐,并制作购物清单。”
- “我可以用食品储藏室里的东西做什么?”
- “检查我的整个菜谱集,找出失效的引用。”
- “将 https://example.com/some-recipe 导入为菜谱。”
- “本周计划中有多少蛋白质?”(需要 Cook Basic 或 Pro)
从源代码构建
cargo build --release
cargo test
二进制文件是 target/release/cook-mcp。它通过标准输入输出传输 MCP。cook-mcp login 和 cook-mcp logout 可在终端中管理 cook.md 登录信息。
从 nutrition-mcp 迁移
@cookmd/nutrition-mcp 仍可使用:它现在是一个运行 @cookmd/mcp 的轻量封装。要切换,请将 MCP 配置中的包名称改为 @cookmd/mcp。你的登录信息会保留。
有两项变化。菜谱工具需要设置 COOK_RECIPES_DIR(旧配置未设置此变量),或者从菜谱文件夹启动客户端;如果两者都没有,菜谱工具会告知 Agent 未设置菜谱文件夹。另外,render_report 的路径现在相对于菜谱文件夹。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。