Skip to main content
Glama
RBV801

recipal-mcp-unofficial

by RBV801

recipal-mcp-unofficial

一个用于 ReciPal 营养标签 API 的 MCP 服务器。它让 AI 助手可以直接读取和编辑你的食谱、配料和子食谱——包括在网页界面中需要数小时才能完成的批量操作。

非官方。 与 ReciPal 无关联、未经其认可,也不受其支持。由该产品的用户基于其公开 API 构建。

过渡项目——本仓库将被归档。 ReciPal 正在构建官方的 MCP 服务器。当他们的版本发布后,本项目将更新以指向它,然后归档为只读。不要在其上构建任何关键功能。参见 SUNSET.md。

你需要一个有效的付费 ReciPal 订阅。 API 访问是付费功能;密钥来自你的账户设置中的 API access。没有它,这个服务器什么都做不了。

用途

ReciPal 的网页界面适合编辑单个食谱。但当你需要对四十个食谱做同样的操作时就很痛苦——修复整个目录中的份量、重命名带有 (copy) 后缀的配料,或构建一组仅一种配料不同的产品变体。这个服务器暴露了 API,让助手可以循环完成这些工作,并先进行试运行。

最有价值的工具是 bulk_clone_and_swap:将一个完全配置好的食谱作为模板,克隆 N 次,并在每个克隆中替换一种配料。标签设置、标签和份量都会继承,因此克隆出来的结果是一致的。

Related MCP server: cookwith-mcp

范围和分发

刻意保持狭窄,并且会一直如此:

  • 你需要克隆并自行构建的源码。 没有一键插件包,没有 npx 包,也没有出现在任何 MCP 目录或市场中。这是对 ReciPal 的承诺,不是疏忽或待办事项。

  • 不发布到 npm。 package.json 有意标记为 private。

  • 按 ReciPal 的要求命名为 recipal-mcp-unofficial,以免被误认为是他们的官方服务器。

添加打包分发、市场提交或更友好的消费者安装路径的拉取请求将被拒绝。参见 CONTRIBUTING.md 了解哪些内容是受欢迎的。

安装

需要 Node.js 18 或更高版本。

git clone https://github.com/BlackBlack/recipal-mcp-unofficial.git
cd recipal-mcp-unofficial
npm install
npm run build

然后将其注册到你的 MCP 客户端。对于 Claude Code:

claude mcp add --transport stdio recipal-mcp-unofficial \
  --env RECIPAL_API_KEY=your_key_here \
  -- node /absolute/path/to/recipal-mcp-unofficial/build/index.js

对于 Claude Desktop,添加到 claude_desktop_config.json:

{
  "mcpServers": {
    "recipal-mcp-unofficial": {
      "command": "node",
      "args": ["/absolute/path/to/recipal-mcp-unofficial/build/index.js"],
      "env": { "RECIPAL_API_KEY": "your_key_here" }
    }
  }
}

重启客户端,然后让它列出你的食谱。你应该会看到 19 个可用工具。完整教程见 docs/SETUP.md。

⚠️ 在将其指向你关心的目录之前,请先阅读此内容

confirm: true 和 dry_run 防护由模型提供,而不是由你提供。 它们可以阻止措辞模糊的提示造成损害。但它们无法阻止一个坚定或困惑的代理——一个决定删除食谱的助手会在同一次调用中传入 confirm: true。ReciPal 没有撤销功能。

因此,真正具有破坏性的工具默认关闭。启用它们是运行服务器的人的有意行为,而不是对话可以做到的事情:

环境变量

启用的功能

为何需要门控

RECIPAL_MCP_ALLOW_DELETE=1

delete_recipe、delete_recipe_ingredient

永久性数据丢失,无法撤销

RECIPAL_MCP_ENABLE_RAW=1

recipal_request

可以用任何方法调用任何端点

其他所有内容——所有读取操作以及常规的创建/更新工具——开箱即用。批量工具始终可用,但默认为 dry_run: true,并且除非调用者同时传入 dry_run: false 和 confirm: true,否则拒绝执行。

无论何种情况都建议的做法:先针对一次性食谱进行操作。 多个端点的行为与文档所暗示的不同(参见已知限制)。

配置

变量

默认值

用途

RECIPAL_API_KEY

—

必需。 来自 ReciPal 账户设置 → API access

RECIPAL_MCP_ALLOW_DELETE

关闭

暴露两个删除工具

RECIPAL_MCP_ENABLE_RAW

关闭

暴露 recipal_request

RECIPAL_MCP_DEBUG

关闭

将完整请求体记录到 stderr。请求体包含食谱数据,而你的客户端可能会将 stderr 记录到磁盘,因此日常使用请保持关闭

RECIPAL_MCP_MAX_RETRIES

3

HTTP 429 时的重试次数

RECIPAL_API_BASE

https://www.recipal.com/api/v1

覆盖端点。必须是 https 且为 recipal.com 主机

RECIPAL_MCP_ALLOW_CUSTOM_BASE

关闭

允许非 recipal.com 的基础地址。你的 API 密钥会被发送到它所指向的任何地址,因此这被刻意设计得很麻烦

参见 .env.example。

工具

共 22 个工具,默认暴露 19 个。包含每个参数的生成参考文档:docs/TOOLS.md。

分组

工具

读取

list_recipes、get_recipe、get_recipe_nutrition、list_recipe_ingredients、get_recipe_ingredient、list_ingredients、get_ingredient、get_recipe_label

食谱写入

create_recipe、create_recipe_shortcut、update_recipe、scale_recipe、create_subrecipe、delete_recipe†

配料行写入

create_recipe_ingredient、update_recipe_ingredient、delete_recipe_ingredient†、update_ingredient

标签

request_label_render

批量

bulk_create_subrecipes、bulk_clone_and_swap

逃生通道

recipal_request†

† 默认禁用。

写入工具接受开放的 fields 对象,而不是固定的参数列表。ReciPal 发布的文档在完整的食谱属性列表之前就截断了,因此硬编码字段名意味着猜测;相反,fields 会被直接传递,以 Rails 风格的表单编码(recipe[name]=...)发送。未记录的属性无需修改代码即可工作。如果端点偏好 JSON,请设置 as_json: true。

在写入食谱之前,先读取一个真实的食谱。 对现有食谱执行 get_recipe 会显示你的账户使用的确切属性名。

已知限制

这些是真实的、已针对实时 API 验证过的问题,在基于此构建之前值得了解:

  • create_recipe_shortcut 无法工作。 它对尝试过的每种配料数组格式都返回 HTTP 422。ReciPal 的文档在参数列表之前就截断了,因此正确的格式未知。请使用 create_recipe + create_recipe_ingredient,或使用 scale_recipe 克隆已配置的模板。该工具被保留,以便可以发现正确的格式——如果你弄清楚了,请提交 PR。

  • PUT /recipe_ingredients/{id} 会静默忽略 ingredient_id。 它返回 HTTP 200,但原始配料仍然保留。将一种配料替换为另一种必须通过先删除再创建来完成,这正是 bulk_clone_and_swap 内部所做的。

  • ReciPal 几乎对每个响应都进行双重包装——{recipe: {recipe_ingredients: [{recipe_ingredient: {…}}]}}。从外层信封读取字段会得到 undefined 且没有错误。如果你扩展这个服务器,请使用现有的 unwrap() / extractRecords() 辅助函数。

  • scale_recipe 和 create_subrecipe 的参数名未发布。 它们通过透传的 fields 工作,但在循环之前,请针对一次性食谱各运行一次并读取响应。

  • 文档将 /recipes/{id}/scale 列为 PUT;实际有效的是 POST。 未经测试不要"修复"这个问题。

  • 没有分页辅助。 list_recipes 每页最多 100 条;请自行遍历页面。

速率限制

ReciPal 文档说明大约 175,000 次请求/周,1,000 次/分钟(超过则返回 HTTP 429),以及最多 5 个并发标签渲染。此服务器遵循 429 并使用 Retry-After 和指数退避,当剩余请求少于 100 次时在 stderr 上发出警告,并且每个批量循环都严格串行运行,带有可配置的延迟。不要并行化标签渲染。

开发

npm run typecheck   # tsc --noEmit
npm run build       # -> build/index.js
npm test            # offline smoke tests, no API key or network needed
npm run gen:docs    # regenerate docs/TOOLS.md from the running server
npm run verify      # all of the above

docs/TOOLS.md 通过启动构建后的服务器并询问其自身的工具列表来生成,因此参考文档不会与代码脱节。如果它过期了,CI 会失败。如果你添加或更改了工具,请运行 npm run build && npm run gen:docs 并提交结果。

欢迎在上述范围内贡献——从 CONTRIBUTING.md 开始,然后参阅 docs/TESTING.md 了解如何针对真实账户验证更改,以及 docs/DESIGN.md 了解各部分如何组合。

许可证

Apache-2.0。

"ReciPal" 是其所有者的商标,此处仅用于描述此软件所交互的对象。

Available Tools

17 tools
bulk_clone_and_swapA

The copy-and-swap loop. For each entry: clone template_recipe_id via scale_recipe, rename it, then replace the designated ingredient line with a different ingredient_id. Runs sequentially and independently per entry, so one failure does not poison the rest. Defaults to dry_run:true.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true to execute.
dry_runNoDefault true.
entriesYesOne entry per new recipe.
delay_msNo
template_recipe_idYesThe fully-configured template recipe to clone from.
swap_recipe_ingredient_idYesThe recipe_ingredient line ID ON THE TEMPLATE that should be replaced. The clone's corresponding line is located by matching ingredient_id.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description usefully discloses sequential execution, per-entry independence, failure isolation, and the dry_run default, which is valuable safety context given no annotations are provided. However, it omits the confirm gate ('Must be true to execute') and does not clarify what a dry run returns or that actual persistence requires confirm=true and dry_run=false. This is a notable but not fatal behavioral gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four short sentences that front-load the core purpose and then add execution semantics, failure isolation, and the dry-run default. There is no filler, and every sentence contributes to an agent's ability to understand and invoke the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a bulk mutation tool with no annotations and no output schema, the description covers the core algorithm, sequential/independent execution, and the dry-run safety default. The main missing piece is explicit mention of the confirm flag, but the schema already documents that, so the description is reasonably complete for selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high (83%), so the baseline is 3. The description adds some algorithmic glue, such as cloning template_recipe_id via scale_recipe and swapping the designated ingredient line with each entry's ingredient_id, but it does not systematically illuminate parameters like confirm or delay_ms beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'The copy-and-swap loop' and then spells out the exact per-entry sequence: clone template_recipe_id via scale_recipe, rename it, then replace the designated ingredient line. This clearly distinguishes the tool from siblings like scale_recipe (single clone) and bulk_create_subrecipes (bulk create without swap), so an agent can identify its purpose without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly frames this as a batch loop over entries, which signals when to use it over single-item operations like scale_recipe. It does not explicitly name alternatives or say 'use this instead of X', but the 'for each entry' construction and the reference to scale_recipe provide enough context for an agent to infer the batch use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bulk_create_subrecipesA

Flag many recipes as subrecipes, sequentially. Defaults to dry_run:true — returns the plan without touching anything. Set dry_run:false AND confirm:true to execute. Returns a per-recipe success/failure report including the new ingredient_ids.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true to execute.
dry_runNoDefault true.
delay_msNoPause between calls (default 400).
recipe_idsYesRecipe IDs to flag.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description fully carries the behavioral burden. It discloses the dry-run default, states that nothing is touched in dry-run mode, explains the exact conditions required to execute, and mentions the per-recipe success/failure report with new ingredient_ids. This is unusually complete for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences carry all essential information: what the tool does, the safe default, the exact execution condition, and the return value. The most important safety information is front-loaded, and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a bulk mutation tool with no output schema and no annotations, the description covers purpose, safety, execution conditions, and the returned report format sufficiently. It could be slightly more complete by explicitly noting the alternative single-item path, but it already gives an agent enough to call and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful interaction semantics beyond the schema: dry_run defaults to true, and both dry_run:false and confirm:true are required together to execute. It also connects 'sequentially' to the delay_ms parameter concept, adding value over the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Flag many recipes as subrecipes, sequentially.' It identifies the resource (many recipes) and the bulk nature, distinguishing it from the singular create_subrecipe sibling by implication, though it does not explicitly name the alternative or clarify the naming mismatch between 'create' and 'flag'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete execution guidance: dry_run defaults true, and execution requires both dry_run:false and confirm:true. This tells the agent exactly when and how to safely invoke the tool, but it does not explicitly state when to choose this tool over create_subrecipe for single-recipe cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_recipeA

Create a new empty recipe. POST /recipes. Prefer scale_recipe (clone a fully-configured template) when you need label settings to match existing recipes.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYesOpen key/value object of attributes. Keys are passed straight through to the ReciPal API namespaced under the resource (e.g. {name, package_yield_quantity, package_yield_unit, servings, packages, suggested_serving, sku, preparation, visual_unit_of_measure}). Call get_recipe on an existing recipe first to see the exact attribute names this account uses. Note that tags cannot be set here -- ReciPal accepts the request and silently ignores a tags string, and errors on other shapes. Tags do carry forward through scale_recipe when cloning a tagged template.
as_jsonNoSend JSON instead of form encoding.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses that the resulting recipe is 'empty' and that the operation is a POST to /recipes, which signals a non-idempotent create. However, it does not mention required permissions, side effects, or what happens on success or failure, so important behavioral context is still missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The core action is front-loaded, the endpoint is a useful quick signal, and the alternative guidance is tucked naturally into the second sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description plus the rich schema is largely complete for invoking the tool: the agent knows what it creates, when to use an alternative, and what fields are expected. The main gap is that there is no output schema and the description doesn't state what the API returns, which could matter for chaining the created recipe into subsequent calls.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are already well documented in the input schema. The tool description itself adds no parameter-level detail, but that is acceptable because the schema provides example attribute names and warns about tag behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action and resource: 'Create a new empty recipe' and even gives the endpoint POST /recipes. The word 'empty' distinguishes it from clone-style operations, and the sibling list shows alternatives like create_recipe_shortcut and create_subrecipe, so there is no ambiguity about what this tool creates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to prefer an alternative: 'Prefer scale_recipe (clone a fully-configured template) when you need label settings to match existing recipes.' This gives a concrete, decision-relevant condition rather than leaving the agent to infer when scale_recipe should be used.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_recipe_ingredientA

Add an ingredient line to a recipe. POST /recipes/{id}/recipe_ingredients. Accepts ingredient_id (required) plus unit + quantity, or total_grams.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYes{ingredient_id (required), unit?, quantity?, waste?, total_grams?}. unit must be one of the ingredient's available units.
as_jsonNo
recipe_idYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It reveals it is a POST creation endpoint but does not mention side effects, ordering, duplicate handling, permissions, failure modes, or response behavior. For a mutating tool this is a meaningful gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core action, and contains no filler. The endpoint and the two payload alternatives are stated compactly without sacrificing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Core invocation is covered: the endpoint and accepted payload shapes are clear. But with no output schema, no annotations, and a nested fields object, the description omits the meaning of as_json, return details, and preconditions like the recipe needing to exist. An agent could call it for basic cases but not with full confidence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is low (33%), so the description must compensate. It adds valuable OR-logic: ingredient_id with unit+quantity, or total_grams, which goes beyond the schema's flat field list. However, the as_json parameter remains completely undocumented, and the nested field names are already present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Add an ingredient line to a recipe.' This is easily distinguished from siblings like create_recipe (whole recipe creation) and update_recipe_ingredient (editing an existing line). Including the endpoint further removes ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The verb and resource imply the tool's use case: when you need to add a new ingredient line to an existing recipe. However, the description does not explicitly mention alternatives or situations when this tool should not be used, such as updating an existing line with update_recipe_ingredient. Context is present but exclusions are absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_recipe_shortcutA

Create a complete recipe with its ingredients in one request. POST /recipes/shortcut. The fastest path for building many recipes. Requires ingredient_ids and ingredient_weights: parallel lists of the same length, weights in grams. Either may be given as an array or a comma-separated string. Note this does NOT inherit label settings from an existing recipe -- serving size, package yield and tags all come back unset, so use scale_recipe to clone a configured template when label settings matter.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYesOpen key/value object of attributes. Keys are passed straight through to the ReciPal API namespaced under the resource (e.g. {name, package_yield_quantity, package_yield_unit, servings, packages, suggested_serving, sku, preparation, visual_unit_of_measure}). Call get_recipe on an existing recipe first to see the exact attribute names this account uses. Note that tags cannot be set here -- ReciPal accepts the request and silently ignores a tags string, and errors on other shapes. Tags do carry forward through scale_recipe when cloning a tagged template. Also include ingredient_ids and ingredient_weights: parallel lists of the same length, weights in grams. Either may be an array or a comma-separated string.
as_jsonNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it discloses a critical non-obvious behavior: label settings are not inherited, so serving size, package yield, and tags come back unset. It also notes the POST endpoint and the parallel-list constraint. It does not describe error behavior or authentication, but the material caveats are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then the endpoint, then usage context, then parameter constraints, then the critical caveat and alternative. Every sentence adds value, and the structure makes it easy for an agent to extract the key facts quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The definition is quite complete for a complex creation tool: it explains the endpoint, required nested fields, constraints, and the key behavioral caveat about label settings. However, there is no output schema and the response shape is not described, so the agent still lacks full information about what the tool returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%, so the description must compensate. It does by clarifying that ingredient_ids and ingredient_weights are required, must be parallel lists of equal length, use grams, and may be arrays or comma-separated strings. The as_json parameter is left undocumented, but it is a simple boolean and the more complex fields parameter is well explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Create a complete recipe with its ingredients in one request.' This clearly differentiates it from sibling tools like create_recipe and create_recipe_ingredient by emphasizing the combined recipe-plus-ingredients behavior and the shortcut endpoint.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly positions this as 'the fastest path for building many recipes' and provides an alternative: 'use scale_recipe to clone a configured template when label settings matter.' This gives the agent a clear when-to-use and when-not-to-use rule with a named sibling alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_subrecipeA

Flag an existing recipe as a subrecipe so it becomes usable as an ingredient in other recipes. POST /recipes/{id}/create_subrecipe. Returns the new ingredient record — capture its ingredient_id, that is what you add to other recipes.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoOptional attributes (e.g. name).
as_jsonNo
recipe_idYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears the full burden. It does disclose the mutation effect ('Flag an existing recipe as a subrecipe') and the return behavior ('Returns the new ingredient record — capture its ingredient_id'), which is helpful. However, it does not mention reversibility, permissions, idempotency, or potential side effects on the original recipe record.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences carry the core purpose, the endpoint, the return value, and actionable follow-up instructions. There is no filler, and the most important behavior is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description gives the essential flow for the main use case and names the output field to capture. But because there is no output schema and no annotation context, the vague optional fields object and the unexplained as_json flag leave an agent with uncertainty about edge cases and response formatting.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The endpoint string ('POST /recipes/{id}/create_subrecipe') and the phrase 'existing recipe' imply that recipe_id is the ID of an existing recipe. The schema already documents fields as optional attributes. However, as_json is not explained anywhere, and the description does not add detail about what kinds of fields are accepted despite the schema coverage being only 33%.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific action ('Flag an existing recipe as a subrecipe') and explains the consequence ('so it becomes usable as an ingredient in other recipes'). This clearly distinguishes it from sibling tools like create_recipe or create_recipe_ingredient, and the endpoint reference reinforces what resource is affected.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool: when an existing recipe should be promoted to a subrecipe/ingredient. It also tells the agent what to do with the result, but it does not explicitly contrast with alternatives such as bulk_create_subrecipes or explain when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ingredientA

Get one ingredient with its full nutrition data and available units.

ParametersJSON Schema
NameRequiredDescriptionDefault
ingredient_idYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden. It accurately discloses that the call retrieves one ingredient and that the response contains nutrition data and available units, but it does not describe behavior for missing IDs, error handling, or any access constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted words. It names the action, object, and key response contents in a compact and scannable form.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter getter, the description names the returned data and is not misleading. Still, with no output schema, no annotations, and siblings like get_recipe_ingredient and list_ingredients, it lacks enough context to fully disambiguate the correct tool and confirm response semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, ingredient_id, is self-descriptive, and the description reinforces that it selects a single ingredient. However, schema description coverage is 0%, and the description does not explain the expected ID format or how to discover valid IDs, leaving the agent with only the property name and type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('get'), a clear resource ('one ingredient'), and the response scope ('full nutrition data and available units'). This distinguishes it from list_ingredients (a plural listing) and implies it is a master-ingredient lookup rather than a recipe-scoped ingredient lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance about when to use this tool instead of related tools such as list_ingredients or get_recipe_ingredient. It implies a single-record lookup, but it provides no exclusions, prerequisites, or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recipeA

Get one recipe in full, including nutrition, serving size, package yield, tags and label settings. Use this to read a template recipe's exact settings before cloning it.

ParametersJSON Schema
NameRequiredDescriptionDefault
recipe_idYesReciPal recipe ID.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden; it explicitly labels the call as reading exact settings and enumerates the returned fields, making the read-only nature apparent. It omits error/authorization details, which are not central for a simple getter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: the first front-loads the operation and contents, the second adds a precise usage trigger. Every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a simple single-id getter with no output schema; the description adequately covers what the response contains and when to call it. No critical missing context remains for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the sole parameter recipe_id is already described as 'ReciPal recipe ID.' The description adds no further parameter-level meaning, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific operation 'Get one recipe in full' and enumerates the returned content (nutrition, serving size, package yield, tags, label settings). This clearly distinguishes it from the nutrition-only sibling get_recipe_nutrition and other recipe-specific getters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs the agent to use this tool 'to read a template recipe's exact settings before cloning it,' giving a concrete trigger. It does not enumerate when to prefer siblings such as get_recipe_nutrition or list_recipe_ingredients, but the use case is clear enough for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recipe_ingredientB

Get one ingredient line on a recipe.

ParametersJSON Schema
NameRequiredDescriptionDefault
recipe_idYes
recipe_ingredient_idYes

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of explaining behavior. It indicates a read operation via 'Get,' but does not disclose the response shape, error behavior, authorization requirements, or any reliance on the recipe context. This is not misleading, but it adds little behavioral detail beyond the tool name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler or redundancy. Every word contributes to identifying the resource and the operation, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only getter with two self-explanatory ID parameters, the description is minimally sufficient. However, with no annotations, no output schema, and no mention of relationship to sibling tools like list_recipe_ingredients or get_ingredient, it leaves some context gaps that an agent would need to infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain either parameter. The names recipe_id and recipe_ingredient_id are reasonably clear, but the description does not clarify that recipe_ingredient_id identifies a line within the recipe or indicate where these IDs come from, so it does not compensate for the lack of schema-level parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Get' with a precise resource, 'one ingredient line on a recipe,' which clearly distinguishes it from list_recipe_ingredients (which returns multiple lines) and get_ingredient (which would fetch ingredient master data rather than a recipe-specific line). The singular phrasing signals exactly which resource the agent will retrieve.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The singular 'Get one' implies this tool is for fetching a specific recipe ingredient line when both IDs are known, rather than listing all lines. However, the description does not explicitly state when to use it over alternatives, mention how to obtain the required IDs, or rule out sibling tools, so the usage guidance is only implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recipe_nutritionA

Get only the nutrition sub-object for a recipe.

ParametersJSON Schema
NameRequiredDescriptionDefault
recipe_idYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden. It discloses that the response is limited to the nutrition sub-object, which is valuable. However, it does not mention error behavior, whether nutrition may be absent, or any authentication requirements, leaving some behavioral context unspecified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence with no filler. The key qualifier 'only' is front-loaded, making the tool's scope immediately clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only retrieval tool, the description provides the essential return-semantics: the nutrition sub-object. It does not explain the content of that sub-object, but with no output schema and a simple operation, the agent has enough information to invoke the tool correctly with recipe_id.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only defines recipe_id with zero description coverage, and the tool description does not explicitly explain the parameter. The mention of 'a recipe' provides contextual anchor for recipe_id, but the description does not add details about format or how to obtain the ID. Since the parameter name is self-explanatory, the gap is moderate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get') and the specific resource ('only the nutrition sub-object for a recipe'). The word 'only' explicitly distinguishes it from broader tools like get_recipe, leaving no ambiguity about its scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'only the nutrition sub-object' conveys a clear use case: when just the nutrition data is needed rather than the full recipe. It does not explicitly name alternatives or exclusion conditions, but the selectivity is strongly implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_ingredientsA

List the account's ingredient library. Subrecipes appear here once created, which is how you find the ingredient_id needed to add a subrecipe to another recipe. Paginated; per_page max 20. Larger values are silently reduced to 20, so callers must paginate.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
searchNoOptional name filter, if supported.
per_pageNoDefault 20, max 20; larger values are silently reduced.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral transparency burden. It discloses important pagination behavior: per_page max 20, larger values silently reduced, and that callers must paginate. It also mentions that subrecipes appear in the list, which is a non-obvious behavior useful to callers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, no filler, and information is front-loaded with the core purpose first. Each sentence earns its place: purpose, use case, and pagination caveat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with no output schema, the description covers the essential operational details: account scope, pagination behavior, silent cap, and the use case for finding ingredient_id. It does not describe the response shape, but the description gives enough for an agent to know what the tool returns and how to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, but the description adds little beyond the schema. It repeats the per_page cap that the schema already documents, and provides no additional meaning for the page or search parameters beyond what the schema minimally says. The undocumented page parameter is not explained in the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the operation: 'List the account's ingredient library.' It distinguishes itself from siblings like list_recipes (recipes vs. ingredients) and list_recipe_ingredients (ingredients within a recipe) by specifying the ingredient library scope. The added context about subrecipes and ingredient_id clarifies its unique purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a specific use case: finding the ingredient_id needed to add a subrecipe to another recipe. However, it does not explicitly contrast with list_recipes, get_ingredient, or list_recipe_ingredients, so the when-to-use guidance is implied rather than clearly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_recipe_ingredientsA

List every ingredient line on a recipe, with recipe_ingredient IDs, ingredient IDs, quantities, units and total_grams.

ParametersJSON Schema
NameRequiredDescriptionDefault
recipe_idYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It discloses the returned fields and the scope ('every ingredient line'), but it does not mention whether the operation is read-only, whether there is pagination/ordering, or how subrecipes are handled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one tightly scoped sentence that leads with the action and resource, then enumerates useful output fields. There is no filler or redundant restating of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter list tool with no output schema, the description adequately conveys what is returned and implies the input. It could be more complete with explicit usage boundaries or parameter semantics, but it is largely sufficient for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single recipe_id parameter has no schema-level description and overall schema coverage is 0%. The description indirectly clarifies that recipe_id identifies the recipe whose lines are listed, but it does not explicitly document the parameter or provide format/source context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and resource ('every ingredient line on a recipe') and names the exact output fields (recipe_ingredient IDs, ingredient IDs, quantities, units, total_grams). This clearly distinguishes it from siblings like get_recipe_ingredient (singular) and list_ingredients (global ingredient catalog).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: when you need all ingredient lines for a given recipe. However, it provides no explicit guidance about when to prefer get_recipe_ingredient for a single line or list_ingredients for a catalog, and it names no alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_recipesA

List recipes from ReciPal with IDs, names, and tags. Paginated; per_page max 20. Larger values are silently reduced to 20, so callers must paginate.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number (default 1).
per_pageNoItems per page (default 20, max 20; larger values are silently reduced).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the transparency burden. It discloses the pagination behavior, the hard cap of 20, the silent reduction of larger values, and the need to paginate. This is valuable behavioral context beyond the bare schema and accurately signals that this is a read-only list operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The first sentence front-loads what the tool returns, and the second adds the essential pagination warning. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple, read-only list tool with fully documented parameters, the description covers what is returned, the pagination constraint, and the caller's responsibility. No output schema exists, but the described fields are enough for an agent to understand the result shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains page and per_page in full. The description's mention of per_page max 20 and silent reduction mainly reiterates what the schema says, adding no new parameter-level meaning. Baseline 3 is appropriate here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List'), a concrete resource ('recipes from ReciPal'), and the included fields ('IDs, names, and tags'). This clearly distinguishes it from the relevant siblings, such as get_recipe for fetching a single recipe or list_recipe_ingredients for a different resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly establishes when to use this tool: to list recipes, with the important caveat that results are paginated and per_page is capped at 20. It does not explicitly mention alternatives or conditions for choosing get_recipe instead, but the list-vs-get context is strongly implied by the wording.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scale_recipeA

Copy (and optionally scale) an existing recipe. POST /recipes/{id}/scale. This is the copy-and-swap primitive: cloning a configured template carries its label settings and tags forward, so you only replace one ingredient afterward. Pass a scale factor of 1 for a straight copy.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoe.g. {name: 'New Recipe Name', scale_factor: 1}. Parameter names for this endpoint are not published; run once against a throwaway recipe to confirm.
as_jsonNo
recipe_idYesRecipe to copy.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and largely meets it: it discloses the copy-and-swap semantics, notes that label settings and tags are carried forward, and warns that endpoint parameter names are unpublished. It does not cover response or error behavior, but the core mutation intent is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: operation, endpoint, behavioral intent, and scale-factor guidance in three short sentences. Every sentence earns its place, and no filler is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations and no output schema, this description is strong: it covers the copy-and-swap scenario, the optional scale factor, and the unpublished-fields risk with a practical workaround. The main remaining gap is the meaning of as_json and the absence of return-value guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The fields object is given a concrete example with name and scale_factor, plus a practical caveat about unpublished parameter names, adding real value beyond the schema. recipe_id is adequately described in the schema, but as_json remains unexplained in both the description and the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a concrete action ('Copy (and optionally scale) an existing recipe') and a specific resource, and adds meaningful context by explaining that cloning a configured template carries label settings and tags forward. This clearly distinguishes it from create, update, and bulk-clone sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description identifies the intended use case: cloning a configured template and then replacing one ingredient afterward, and it clarifies that a scale factor of 1 produces a straight copy. It does not explicitly name alternatives or exclusion conditions, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_ingredientA

Update an ingredient in the library. PUT /ingredients/{id}. Use for renaming (e.g. stripping '(copy)' suffixes).

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYese.g. {name: 'Vanilla Concentrate'}
as_jsonNo
ingredient_idYes

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full behavioral burden, but it only restates the mutation and offers a use example. It does not disclose whether the update is partial or a full PUT replacement, what fields are accepted beyond name, whether auth is required, what the response looks like, or any side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it states the operation, the endpoint, and the intended use case in two sentences. There is no repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with no annotations, no output schema, an undocumented 'as_json' boolean, and a flexible nested 'fields' object, this description is not complete enough for fully safe autonomous invocation. It gives good purpose but lacks behavioral and response details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning to the 'fields' parameter via the renaming use case and connects ingredient_id to the resource path. However, schema coverage is only 33%, and the 'as_json' parameter is completely unexplained in both schema and description, so the description only partially compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the operation (update), the resource (an ingredient in the library), and the exact HTTP endpoint (PUT /ingredients/{id}). The phrase 'in the library' helps distinguish this from sibling tools like update_recipe_ingredient, which operate at the recipe level.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit use case: renaming ingredients, such as stripping '(copy)' suffixes. It does not explicitly name alternatives or state when not to use the tool, but the library context and concrete example provide clear practical guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_recipeA

Update a recipe's attributes. PUT /recipes/{id}.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYesOpen key/value object of attributes. Keys are passed straight through to the ReciPal API namespaced under the resource (e.g. {name, package_yield_quantity, package_yield_unit, servings, packages, suggested_serving, sku, preparation, visual_unit_of_measure}). Call get_recipe on an existing recipe first to see the exact attribute names this account uses. Note that tags cannot be set here -- ReciPal accepts the request and silently ignores a tags string, and errors on other shapes. Tags do carry forward through scale_recipe when cloning a tagged template.
as_jsonNo
recipe_idYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It adds useful behavioral detail: tags are silently ignored or error depending on shape, and keys are passed through to ReciPal namespaced under the resource. However, it does not disclose whether the update is partial or full replacement, what the response contains, or any side effects or permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core description is a single front-loaded sentence with the endpoint, and the longer parameter description is dense with useful caveats rather than fluff. The scale_recipe note is slightly tangential but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description should cover return/error behavior and update semantics; it does not. But it does provide enough field-level guidance and a prerequisite for an agent to likely call the tool correctly for the main use case.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The fields parameter is richly explained with example keys, namespacing behavior, and a get_recipe first instruction, compensating for low schema coverage. However, as_json is left undocumented, and recipe_id only appears by name and in the URL pattern, so the description does not fully compensate for the 33% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the exact operation: updating a recipe's attributes, reinforced by the PUT /recipes/{id} endpoint. The resource (recipe, not recipe_ingredient or ingredient) and action are unambiguous, distinguishing it from siblings like update_recipe_ingredient and create_recipe.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for modifying an existing recipe and gives a practical prerequisite (call get_recipe first to see account-specific attribute names). It does not explicitly say when to prefer this tool over alternatives such as create_recipe or scale_recipe, and only notes an exclusion for tags.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_recipe_ingredientA

Update one ingredient line. PUT /recipes/{id}/recipe_ingredients/{ri_id}. NOTE: this endpoint silently ignores ingredient_id — it returns 200 with the original ingredient still attached. To swap one ingredient for another you must delete the line and create a new one.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYes{unit?, quantity?, waste?, total_grams?} — ingredient_id is ignored.
as_jsonNo
recipe_idYes
recipe_ingredient_idYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It goes beyond the schema by revealing that the endpoint silently ignores ingredient_id and returns 200 with the original ingredient still attached. This is a significant non-obvious behavior that would otherwise lead to silent data corruption. It does not describe all side effects or response details, but the most critical trap is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it states the operation, gives the endpoint, then flags the critical caveat and workaround. Every sentence earns its place with no redundant wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and no output schema, the description covers the core operation and the main failure mode well. However, it does not explain what the response contains beyond a 200 status, and the as_json parameter remains unexplained. The tool is usable for a simple update, but the context around parameter behavior and return value is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 25%, so the description needed to compensate. The PUT path usefully maps recipe_id and recipe_ingredient_id, and the note reinforces that ingredient_id is ignored. However, as_json is entirely undocumented in both the schema and the description, and the fields object's allowed keys are only partially addressed through schema text, not the description. This leaves a meaningful semantic gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action and resource: 'Update one ingredient line,' reinforced by the PUT path identifying recipe and recipe_ingredient IDs. It is specific enough to distinguish updating a recipe ingredient line from updating a recipe or an ingredient master record, though it does not explicitly name sibling alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance ('Update one ingredient line') and clear when-not-to-use guidance: attempting to swap an ingredient via ingredient_id silently fails, and the tool must not be used for that purpose—delete and create instead. This directly prevents a likely misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 17 tool updatesv0.6.2
    • First observedbulk_clone_and_swap
    • First observedbulk_create_subrecipes
    • First observedcreate_recipe
    • First observedcreate_recipe_ingredient
    • First observedcreate_recipe_shortcut
    • First observedcreate_subrecipe
    • First observedget_ingredient
    • First observedget_recipe
    • First observedget_recipe_ingredient
    • First observedget_recipe_nutrition
    • First observedlist_ingredients
    • First observedlist_recipe_ingredients
    • First observedlist_recipes
    • First observedscale_recipe
    • First observedupdate_ingredient
    • First observedupdate_recipe
    • First observedupdate_recipe_ingredient

TDQS

A3.8/5.0

Scored across 17 tools

Disambiguation4/5

Most tools target distinct resources or actions, and descriptions clearly separate list/get/create/update/bulk workflows. A few overlaps exist—get_recipe versus get_recipe_nutrition, and create_recipe versus create_recipe_shortcut versus scale_recipe—but the descriptions are detailed enough to prevent serious misselection.

Naming Consistency5/5

Tool names consistently follow lowercase snake_case verb_noun patterns like list_recipes, get_recipe, create_recipe, update_recipe, and bulk_create_subrecipes. Compound names like create_recipe_shortcut and bulk_clone_and_swap are minor extensions but do not break the overall predictable convention.

Tool Count4/5

17 tools is slightly above the ideal 3-15 range, but the count is justified by the combination of single-resource operations, bulk utilities, and shortcut creation. Each tool serves a recognizable recipe-management workflow, so the set feels somewhat heavy but not bloated.

Completeness2/5

The tool surface covers read, create, update, copy, and bulk operations, but there are no delete endpoints for recipes, ingredients, or recipe ingredient lines. This is a significant gap because update_recipe_ingredient silently ignores ingredient_id and the documentation explicitly says swapping requires deleting the line and creating a new one—yet no delete tool exists to complete that workflow.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

  • MCP server that lets AI assistants use all OneSchema features exposed via the public API.

  • MCP server for OpenAI API (chat completions, image generation, embeddings) via AceDataCloud

  • Your Recipes, Beautifully Kept. weReci MCP server lets Claude and other MCP clients work with your personal weReci cookbook, the recipes you've imported from the web, social video and scanned family books. Interactive UI in the chat. weReci supports MCP Apps, so in clients that support it, tools return live views instead of plain text: recipe cards, shopping lists and your recipe graph. Clients without MCP Apps support get the same results as text. Find and read recipes: search your collection in plain language, open any recipe in full, or get an overview of what's in your cookbook. Cook with them: scale a recipe to any serving count, with cooking adjustments as well as amounts. Get substitution suggestions with ratios and caveats. Explore connections: browse your recipe graph (shared ingredients, techniques and cuisines), trace the connection between two recipes, and look up where a dish sits on the cuisine map. Themed collections: list the themed groups weReci curates from your cookbook, or ask it to reshuffle them. Shop: build a shopping list from one or more recipes, add or update items, and read the list back. Share: email a recipe to someone. Longer jobs like conceit reshuffles run in the background, with tools to check their progress. Everything is scoped to your own cookbook, or to a shared one you've joined.

  • Hosted MCP server to manage a restaurant menu from AI agents - 39 tools over the DuckHub API.

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    An MCP server that transforms AI assistants into personal chefs by providing recipe recommendations and meal planning features based on the HowToCook repository.
    5
    539 npm
    779
    ISC
  • A
    license
    B
    quality
    D
    maintenance
    An MCP server that enables AI-powered recipe generation and transformation using natural language, supporting dietary restrictions, allergies, and nutritional goals.
    2
    13 npm
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    MCP server for MealMastery AI meal planning that enables users to manage meal plans, recipes, and grocery lists through natural language conversation with AI agents like Claude.
    32 npm
    MIT